Windows突发断电/关机后backlog.json为空的问题解决求助
解决Windows断电后备份文件为空的问题
问题根源
你遇到的核心问题是直接用'w'模式覆盖原文件导致的:当用'w'打开文件时,Windows会立即清空原有内容,若此时突发断电,写入操作还没完成,文件就会变成空的。备份文件为空则是因为你复制的是已经损坏的原文件,自然也得到空文件。
具体解决方案
1. 临时文件+原子替换(最可靠)
不要直接覆盖原文件,先把数据写入临时文件,确认写入完整后再替换原文件。这样就算断电,原文件要么是完整的旧版本,要么是完整的新版本,绝不会出现空文件。
代码示例:
import os import json def save_backlog(data): # 定义临时文件路径 tmp_file = "backlog.tmp" # 写入临时文件并强制刷入磁盘 with open(tmp_file, "w", encoding="utf-8") as f: json.dump(data, f) # 刷新用户缓冲区到系统缓冲区 f.flush() # 强制系统把缓冲区内容写入磁盘硬件 os.fsync(f.fileno()) # 原子替换原文件(Windows下os.replace是原子操作,不会出现中间态) os.replace(tmp_file, "backlog.json")
2. 同步生成可靠备份文件
如果需要备份,不要复制可能损坏的原文件,而是从完整的临时文件复制生成备份,确保备份文件始终是完整的:
代码示例:
import os import json def save_backlog_with_backup(data): tmp_file = "backlog.tmp" backup_file = "backlog_copy.json" # 写入临时文件并刷盘 with open(tmp_file, "w", encoding="utf-8") as f: json.dump(data, f) f.flush() os.fsync(f.fileno()) # 从临时文件复制生成备份 with open(tmp_file, "rb") as src, open(backup_file, "wb") as dst: dst.write(src.read()) dst.flush() os.fsync(dst.fileno()) # 替换原文件 os.replace(tmp_file, "backlog.json")
3. 关键操作:强制刷盘
无论用哪种方式,写入后必须调用flush()和os.fsync()。Python的write()只是把数据写到内存缓冲区,系统可能延迟写入磁盘,断电时缓冲区数据会丢失。这两个操作能确保数据真正写入磁盘硬件。
额外建议
- 定时器不要设置太频繁,频繁写入会增加磁盘负担和中断风险,根据业务需求设置合理间隔(比如1分钟以上)。
- 程序启动时读取文件要加异常处理,比如文件不存在、JSON格式错误时,用默认值初始化变量,避免程序崩溃。
内容的提问来源于stack exchange,提问作者H236
相关产品推荐
相关产品推荐

