c# - 在计算机崩溃时调用 File.WriteAllText 会导致数据丢失
问题描述
我有以下代码来保存数据:
File.Copy("data.txt", "data_backup.txt", true);
File.WriteAllText("data.txt", JsonConvert.SerializeObject(new
{
bool1,
string1,
decimal1,
decimal2,
int1,
datetime,
object1,
object2
}, new JsonSerializerSettings { Formatting = Formatting.Indented, Converters = new List<JsonConverter>() { new DontIntendArray() } }));
我的程序每 15 秒执行一次。data.txt 的大小约为 9 MB。
有时当我的计算机崩溃然后重新启动后,我发现 data.txt 充满了 NULL 字符,而它的大小仍然保持在 9 MB 左右。这就是为什么我添加了 data_backup.txt 行但它没有帮助,因为它也保存了充满 NULL 的文件。
请注意,这不会发生在每台计算机上,但显然只有在执行此代码时崩溃时才会发生。
我在我的 RAM 上使用 XMP 配置文件时遇到了这种行为,该配置文件不稳定并且不时导致崩溃。在 XMR 配置文件不稳定的两台不同计算机上,情况完全相同。我在停电时也经历过。
我知道我不能指望崩溃的计算机完美地执行所有代码然后才崩溃。但是,我可以使用任何技巧来防止在计算机崩溃之前或之前写入或保存的文件内容丢失吗?定期将这些变量保存到文件中的全部目的是为了防止在计算机崩溃的情况下丢失数据,但显然这种方法并不总是有效。
解决方案
您应该保存到一个新的文件名,然后在保存后移动新文件以替换原始文件。这样,无论您何时被打断,您始终拥有一份完整的副本。
推荐阅读
- python - PyGObject 模板子未定义
- java - Java Eclipse 通过 Tomcat 连接到 MySQL
- javascript - Chrome 扩展 - 在浏览器关闭时清除 chrome 同步存储
- c# - 如何在弹性搜索中使用 Serilog 每天自动生成索引
- macos - 如何将真实/物理 NVMe 传递给 qemu 机器?(主机 MacOS,来宾 Windows)
- javascript - IndexOf 不适用于 ie 中的日期 tolocalestring,但 ie 支持它
- sqlite - System.Data.SQLite : VACUUM INTO 内存数据库
- google-apps-script - "errorCode":"UNSPECIFIED_ERROR","message":"非静态方法需要一个目标。"
- angular - 如何为图像创建自定义管道?
- c++ - 如何找出为什么我的程序一直有一个无限循环?