当突然关闭时,XML文件数据会丢失

本文关键字:数据 文件 XML 突然 | 更新日期: 2023-09-27 18:10:19

我有一个应用程序,它使用XElement对象的.Save("path"(方法每隔500毫秒将数据存储在XML文件中。问题是:当突然关闭时,文件的内容会被删除,因此在下一次运行应用程序时,该文件无法使用。

如何防止/确保数据不会丢失?附言:我在Windows7下使用.NET 2010 C#

我做了一个实验:不是每次都向我创建的同一个data.xml文件(通过从原始文件复制(写入一个新文件,当从data.xml文件复制时电源关闭时,它会损坏以前创建的所有文件?!?!?

当突然关闭时,XML文件数据会丢失

假设您的文件是data.xml。与其一直写入data.xml,不如写入临时文件data.xml.tmp,完成后将其重命名为data.xml。但是,如果您已经有一个data.xml文件,则重命名将不起作用,因此您需要先删除它,然后重命名临时文件。

这样,data.xml将包含最后一个安全数据。如果您突然关闭,不完整的文件将是临时data.xml.tmp。如果您的程序稍后尝试读取该文件,但没有data.xml文件,则意味着在删除和重命名操作之间发生了关闭,因此您将不得不读取临时文件。我们知道它是安全的,因为否则会有一个data.xml文件。

您可以使用两阶段提交:

  1. 将新的XML写入具有不同名称的文件
  2. 删除旧文件
  3. 将新文件重命名为旧名称

这样,将始终至少有一个完整的文件
如果重新启动,但标准名称不存在,请检查其他名称。

这个人可能是生命的救世主,但只需要付出更多的努力。应该有一个单独的过程来进行

  • 每当文件更新时,都会自动备份到其存储区
  • 它在内部维护一个链表中的两个版本
  • 如果文件更新,则最新版本应更新为HEAD using linkedList.AddFirst()TAIL指向的最低版本可由linkedList.RemoveLast()删除
  • 当然,它应该在启动期间扫描并加载关于存储库中可用的最新版本的存储库

在硬关闭场景中,当系统下次启动时,此过程应检查文件是否有效/已损坏。如果损坏,则从HEAD恢复最新的,并使用简单的FileSystemWatcher订阅FileChanged通知。

这种方法经过了很好的测试。

看到的问题

  • 如果在更新HEAD时发生硬关机,该怎么办?--好吧,还有另一个版本,我们把它藏在HEAD旁边
  • 如果在存储为空的情况下更新HEAD时发生硬关闭,该怎么办?——我们知道该文件在更新HEAD时是有效的。进程应在下次启动时再次尝试复制,因为它没有损坏
  • 如果存储空间是空的,并且文件已损坏,该怎么办?——这是一个死亡坑,没有解决方案。但是,只有在文件损坏发生后部署此恢复过程时,才会出现这种情况