覆盖文档文件

时间:2011-08-20 09:11:18

标签: c# .net file-io

我正在开发一个基于文档的桌面应用程序,当用户保存文档时,该应用程序会将相当大且复杂的文件写入磁盘。为防止数据损坏,最好的做法是什么?有很多事情可以发生:

保存过程可能会中途失败,这当然是一个严重的应用程序错误,但在这种情况下,人们宁愿让旧文件留下比损坏的半写文件。如果应用程序因文件写入中途的某些其他原因而终止,则会出现同样的问题。

我能想到的最强大的方法是在保存时使用临时文件,并且只有在成功创建新文件后才替换原始文件。但我发现有几个操作(创建临时文件,保存到临时文件,删除原始文件,移动临时文件到原始文件)可能会或可能不会失败,我最终会遇到相当复杂的try / catch语句来正确处理它们。 / p>

这种情况是否有最佳做法/标准?例如,将原始文件复制到临时文件然后覆盖原始文件比保存到临时文件更好吗?

另外,基于文档的应用程序(在Windows中)文件状态的原因是什么?在用户关闭文档之前,将文件保持打开以供应用程序写入是不是更好,或者只是在打开时快速读取文件并快速关闭它?优点和缺点?

3 个答案:

答案 0 :(得分:1)

通常,文件改组舞蹈就是这样的,目的是最终得到包含新数据的file.txt

  • 写入file.txt.new
  • 将file.txt移至file.txt.old
  • 将file.txt.new移至file.txt
  • 删除file.txt.old

您始终至少拥有一个有效文件:

  • 如果只存在file.txt,则无法开始编写file.txt.new
  • 如果存在file.txt和file.txt.new,则在写入期间可能会失败 - file.txt应该是有效的旧副本。 (如果您可以验证文件,则可以尝试加载新文件 - 可能是失败的移动)
  • 如果存在file.txt.old和file.txt.new,则第二次移动操作失败。您可以使用任一文件,具体取决于您是想要新的还是旧的
  • 如果存在file.txt.old和file.txt,则删除操作失败。同样,您可以使用任一文件。

这假设您正在使用原子移动操作的文件系统。如果情况并非如此,我相信程序是一样的,但你需要对恢复程序更加小心。

答案 1 :(得分:0)

回答上一个问题:

如果我们在这里谈论相当复杂和大的文件,我会选择在阅读时锁定文件我可能不需要在视图上加载所有数据,但现在只需要一个用户。

首先是:

  1. 始终保存在临时文件中。
  2. 用新的替换旧的,如果失败,考虑到你的应用程序是文档管理应用程序,你的主要目标失败,所以最糟糕的情况,但你有新的临时文件。所以关于这个错误可以关闭你的应用程序并重新打开(严重错误),重新打开控制,如果有临时文件,如果是,运行数据恢复,或多或少像VS在崩溃的情况下。

答案 2 :(得分:0)

创建临时文件,然后用临时文件替换原始文件(后者在I / O方面是一种廉价的操作)是MFC文档持久性类使用的机制。我从未见过它失败过。用户也没有报告此类问题。当时是的,文件很大(它们也很复杂,但就I / O而言,这是无关紧要的。)