45-崩溃后草稿损坏-用临时文件和恢复账本保护输入
第45篇崩溃后草稿损坏用临时文件和恢复账本保护输入摘要编辑页草稿最怕“写了一半崩溃再打开内容坏了”。如果每次输入都直接覆盖正式草稿崩溃、磁盘异常或序列化失败都会把可恢复内容一起毁掉。更稳的做法是写临时文件和恢复账本完整写入后再原子替换重启时按账本恢复或隔离损坏草稿。有个长文编辑页用户写到一半切后台应用被系统回收。重进后草稿还在但正文少了后半段图片列表也乱了。原代码在每次输入后直接覆盖draft.json中途写入失败就留下了半截 JSON。草稿保存不能只追求实时要保证任何一次崩溃都不会破坏上一份完整内容。这篇文章解决四个实际问题草稿写入先落临时文件成功后再替换正式文件。恢复账本记录最后一次完整版本和待恢复版本。重启时先校验 JSON 和版本不直接打开损坏草稿。保存频率用防抖和显式保存结合避免每个字符都落盘。先确认损坏的是内容还是索引草稿损坏不一定是文件消失。可能是 JSON 半截、图片附件缺失、版本不匹配或者页面读取了旧索引。位置现象风险处理方向正文少半截直接覆盖正式文件崩溃留下半写入临时文件加替换图片错位附件和正文不同步索引先更新了快照统一保存重启空白解析失败被当成空草稿损坏隔离频繁卡顿每字符写文件防抖保存这一步的价值是先把问题放回运行链路。只要能确认问题停在哪个位置后面就不用靠猜测改页面。编辑状态和持久草稿要隔一层快照页面里的输入状态变化很频繁持久化层需要的是完整快照。不要让每个输入框都直接写草稿文件。模块应该负责不应该负责EditorPage当前输入、保存中提示文件路径DraftSnapshotBuilder把页面状态转成快照磁盘写入DraftStore临时文件和替换UI 布局DraftJournal版本、路径、恢复状态输入事件RecoveryPage恢复或丢弃选择序列化细节边界定清后代码就不会在页面、服务和回调之间来回复制同一段判断。后续新增场景也能先判断应该落在哪一层。草稿快照要有版本和校验字段exportinterfaceDraftSnapshot{draftId:stringversion:numbertitle:stringbody:stringattachmentIds:string[]savedAt:number}exportinterfaceDraftJournalEntry{draftId:stringstableVersion:numberpendingVersion:numberrecovering:booleanupdatedAt:number}exportfunctionisValidDraft(snapshot:DraftSnapshot):boolean{returnsnapshot.draftId.length0snapshot.version0snapshot.savedAt0}版本号和账本让重启恢复有依据。页面不能把解析失败的草稿直接当成空内容否则用户会以为内容被正常清掉了。这类模型最好放在models或common中页面、Service 和仓储都使用同一份类型避免各层用字符串互相猜。写入走临时文件再替换正式文件exportclassDraftStore{constructor(privatereadonlyfileWriter:DraftFileWriter){}asyncsave(snapshot:DraftSnapshot):Promisevoid{consttempPathdraftTempPath(snapshot.draftId,snapshot.version)conststablePathdraftStablePath(snapshot.draftId)awaitthis.fileWriter.writeText(tempPath,JSON.stringify(snapshot))constloadedJSON.parse(awaitthis.fileWriter.readText(tempPath))asDraftSnapshotif(!isValidDraft(loaded)){thrownewError(invalid draft snapshot)}awaitthis.fileWriter.replace(tempPath,stablePath)}}先写 temp再读回校验最后替换正式文件。即使写 temp 过程中崩溃上一份 stable 草稿仍然存在。Service 的目标不是把所有逻辑都塞进去而是把跨页面、跨生命周期或需要持久化的判断集中起来。页面只表达用户动作。页面用防抖保存完整快照Componentstruct ArticleEditorPage{Statetitle:stringStatebody:stringStatesaving:booleanfalseprivateautosave:DraftAutosaveServicecreateDraftAutosaveService()onInputChanged():void{constsnapshotthis.buildSnapshot()this.autosave.schedule(snapshot)}privatebuildSnapshot():DraftSnapshot{return{draftId:currentDraftId(),version:Date.now(),title:this.title,body:this.body,attachmentIds:readAttachmentIds(),savedAt:Date.now()}}}页面只负责生成完整快照不直接写文件。附件 id 和正文一起进入快照避免正文恢复了、附件索引没恢复。页面层要控制展示和交互节奏但不应该拥有底层事实。这样页面重建、横竖屏变化或返回前台时都能重新从 Service 拿到可信结果。恢复时先隔离损坏版本exportclassDraftRecoveryService{constructor(privatereadonlystore:DraftStore,privatereadonlyjournal:DraftJournal){}asyncrecover(draftId:string):PromiseDraftSnapshot|null{conststableawaitthis.store.loadStable(draftId).catch(()null)if(stable!nullisValidDraft(stable)){awaitthis.journal.markRecovered(draftId,stable.version)returnstable}awaitthis.journal.markCorrupted(draftId)returnnull}}恢复服务不把坏文件吞掉。能恢复就标记已恢复不能恢复就标记损坏让页面给出恢复失败说明而不是直接显示空白编辑器。实际项目里很多问题不是第一次进入页面暴露而是在冷启动、返回前台、页面重建或回调晚到时暴露。把这段生命周期补上修复才算闭环。恢复提示要给用户选择情况页面表现工程处理找到稳定草稿提示恢复上次编辑用户确认后进入编辑页只有损坏草稿隔离坏文件提示无法恢复并保留日志附件缺失恢复正文并标记附件失败不要丢正文保存中崩溃使用上一个 stabletemp 不覆盖正式草稿兜底路径不是可有可无。用户遇到异常时页面至少要给出当前状态、可执行动作和可排查线索。排查时找直接覆盖草稿的代码rg-ndraft.json|writeText|replace|autosave|DraftSnapshotentry features common rg-nJSON.parse|JSON.stringify|attachmentIds|DraftJournalentry features common rg-nonTextChange|onInput|schedule\(|debounceentry features common第一组命令找旧路径第二组命令找新边界第三组命令看生命周期或回调位置。命中后不要只看字段名要判断它是否仍在直接改页面状态。验证清单验证项预期结果输入后立刻杀进程重启恢复到上一份完整草稿写 temp 失败stable 草稿不损坏JSON 半截进入损坏隔离不显示空白假象附件缺失正文仍可恢复连续输入不会每字符同步写文件卡顿这些验证最好在真机或模拟器里按顺序走一遍。只看源码很难发现冷启动、重启和回调晚到这类问题。常见问题和处理方式现象常见原因处理方式草稿半截直接覆盖正式文件temp 加替换打开变空白解析失败当空草稿损坏隔离并提示附件乱了正文和附件分开保存统一 DraftSnapshot输入卡顿保存频率太高防抖保存如果现象没有出现在表里仍然建议按“输入来源 - 中间状态 - 持久化或页面展示 - 失败兜底”的顺序排查。小结草稿保存先保护上一份完整内容草稿不是普通缓存它承载用户输入。写入时先生成完整快照落临时文件校验后替换正式版本重启时按恢复账本加载稳定版本坏文件隔离。这样即使崩溃发生在写入中间用户也不会丢掉上一份可用内容。| 保存频率太高 | 防抖保存 |如果现象没有出现在表里仍然建议按“输入来源 - 中间状态 - 持久化或页面展示 - 失败兜底”的顺序排查。小结草稿保存先保护上一份完整内容草稿不是普通缓存它承载用户输入。写入时先生成完整快照落临时文件校验后替换正式版本重启时按恢复账本加载稳定版本坏文件隔离。这样即使崩溃发生在写入中间用户也不会丢掉上一份可用内容。

相关新闻

TMS320F2838x CMSYSCTL_REGS:系统控制、低功耗与复位管理详解

TMS320F2838x CMSYSCTL_REGS:系统控制、低功耗与复位管理详解

1. 深入理解CMSYSCTL_REGS:TMS320F2838x系统控制的基石在嵌入式系统开发,尤其是工业控制和汽车电子这类对实时性、可靠性和功耗有严苛要求的领域,微控制器的系统控制单元扮演着“中枢神经系统”的角色。它不像外设驱动那样直接处理数据收发&a…

2026/8/3 2:58:55 阅读更多 →
diff2html深度解析:Git差异可视化与代码审查的专业解决方案

diff2html深度解析:Git差异可视化与代码审查的专业解决方案

diff2html深度解析:Git差异可视化与代码审查的专业解决方案 【免费下载链接】diff2html Pretty diff to html javascript library (diff2html) 项目地址: https://gitcode.com/gh_mirrors/di/diff2html diff2html是一个功能强大的JavaScript库,专…

2026/8/2 0:57:05 阅读更多 →
5个步骤彻底解决Windows风扇噪音:FanControl实战指南

5个步骤彻底解决Windows风扇噪音:FanControl实战指南

5个步骤彻底解决Windows风扇噪音:FanControl实战指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/…

2026/8/1 18:14:39 阅读更多 →

最新新闻

TRAE与PICO结合:低代码开发沉浸式VR/AR应用实践指南

TRAE与PICO结合:低代码开发沉浸式VR/AR应用实践指南

这次我们来看一个技术分享会的全程录屏内容,主题是“用 TRAE,写一个跳出屏幕的 App”。这个分享会聚焦于 TRAE 与 PICO 的结合,探讨如何利用 TRAE 这一工具或平台,开发出更具沉浸感和交互性的 VR/AR 应用。对于关注前沿开发工具、…

2026/8/3 4:14:53 阅读更多 →
HBuilder调试基座安装成功但无App图标?系统化排查指南

HBuilder调试基座安装成功但无App图标?系统化排查指南

1. 问题现象与初步排查:当调试基座“安装成功”却不见踪影 最近在折腾一个移动端项目,用HBuilder X打包调试基座准备真机联调,结果遇到了一个挺典型的问题:控制台明明打印了“安装HBuilder调试基座完成”,但扭头一看手…

2026/8/3 4:14:53 阅读更多 →
GPT-5.6降价之后,ChatGPT与Codex开发成本下降,工程复杂度为什么反而上升?

GPT-5.6降价之后,ChatGPT与Codex开发成本下降,工程复杂度为什么反而上升?

GPT-5.6 Luna价格下降80%,Terra价格下降20%以后,开发者最直观的感受是:使用AI完成编程任务的成本进一步降低了。 过去舍不得反复交给模型处理的测试补充、文档更新、代码检查和简单重构,现在可以更频繁地执行;过去只能…

2026/8/3 4:14:53 阅读更多 →
Python实现轻量级线性回归库mylinear代码解析

Python实现轻量级线性回归库mylinear代码解析

1. mylinear项目代码深度解析在数据处理和机器学习领域,线性模型始终扮演着基础而重要的角色。今天要剖析的mylinear项目,是一个轻量级但功能完备的线性回归实现库,特别适合需要快速验证想法或教学演示的场景。这个纯Python实现的库虽然代码量…

2026/8/3 4:14:53 阅读更多 →
京东云2026企业服务器优惠与优化全攻略

京东云2026企业服务器优惠与优化全攻略

1. 京东云2026企业服务器优惠全景解读作为国内主流云服务商之一,京东云每年推出的企业级服务器促销活动都备受中小企业和技术团队关注。2026年的优惠方案在延续经典产品线的基础上,针对不同规模企业的用云需求进行了更精细化的设计。本文将深度解析当前可…

2026/8/3 4:14:53 阅读更多 →
Spring Security 403错误排查:从权限决策到生产实践

Spring Security 403错误排查:从权限决策到生产实践

在实际开发中,我们常常会遇到一些看似简单、但调试起来却异常棘手的问题。这些问题往往不是由复杂的业务逻辑或高深的算法引起的,而是源于一些基础配置、环境差异或框架的默认行为。一个典型的例子就是 HTTP 状态码403 Forbidden,尤其是在使用…

2026/8/3 4:13:52 阅读更多 →

日新闻

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南

3个让你工作效率翻倍的Umi-OCR实战技巧:免费离线文字识别完全指南 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

[具身智能-181]:PC+服务器+具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构

PC服务器具身机器人:构建具身智能从仿真到量产的闭环迭代混合架构一、前言:具身智能需要“混合算力闭环系统”传统人工智能依赖云端静态数据集训练,不具备物理交互能力,无法适应真实世界的不确定性。具身智能(Embodied…

2026/8/3 0:00:47 阅读更多 →
[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

[具身智能-181]:大分布式通信模型对比:看懂为什么 DDS 是 ROS2 底层通信最优解

前言构建机器人、具身智能这类分布式实时系统,通信底座直接决定整套系统的实时性、容错性、组网能力。分布式领域长期存在 4 类经典通信架构:点对点模式、Broker 中间代理模式、广播模式、以数据为中心(DDS)模式。很多开发者疑惑&…

2026/8/3 0:00:47 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/2 0:00:38 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/2 0:00:38 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/2 6:34:16 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/2 2:47:48 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/2 0:23:22 阅读更多 →