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

时间:2013-04-22 20:33:25

标签: c# shutdown xelement

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

如何防止/确保数据不会丢失? P.S:我在Windows 7下使用.NET 2010 C#

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

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:1)

您可以使用两阶段提交:

  1. 将新XML写入名称不同的文件
  2. 删除旧文件
  3. 将新文件重命名为旧名称
  4. 这样,总会有至少一个完整的文件 如果重新启动,并且标准名称不存在,请检查其他名称。

答案 2 :(得分:0)

此人可能是救生员,但只需付出更多努力即可。应该有一个单独的过程

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

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

这种方法已经过测试。

看到的问题

  • 如果在更新HEAD时发生硬关机该怎么办? -嗯,HEAD
  • 旁边的存储库中还有另一个版本
  • 如果存储空间为空,在更新HEAD时硬关闭发生了怎么办? -我们知道文件在更新HEAD时是有效的。该过程应在下次启动时尝试再次复制,因为它没有损坏。
  • 如果存储空间为空并且文件已损坏怎么办? -这是死亡陷阱,目前尚无解决方案。但是这种情况仅在文件损坏发生后部署恢复过程时才会发生。