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

问题描述 投票:2回答:3

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

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

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

c# shutdown xelement
3个回答
5
投票

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

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


1
投票

您可以使用两阶段提交:

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

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


0
投票

这个可能是一个生命救星,但只需要更多的努力。应该有一个单独的过程

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

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

这种方法经过了充分测试。

看到的问题

  • 如果在更新HEAD时发生硬关机怎么办? - 好吧,我们在HEAD旁边的藏匿处有另一个版本
  • 如果在存储空为止时更新HEAD时发生硬关闭怎么办? - 我们知道在更新HEAD时该文件是有效的。该进程将在下次启动时再次尝试复制,因为它没有被破坏。
  • 如果存储空为空且文件已损坏怎么办? - 这是死亡坑,没有解决方案。但是,只有在文件损坏发生后部署此恢复过程时,才会出现此情况。
© www.soinside.com 2019 - 2024. All rights reserved.