文件损坏停电后

问题描述:

我正在使用File.WriteAllBytes将更改写入文件。文件损坏停电后

如果在调用WriteAllBytes之后发生停电,则文件总是被损坏。 问题是,这不仅发生在我的Save函数执行期间,而且甚至在函数执行完成后 - 有时甚至在我调用Save之后的一个小时后。

我试过使用BinaryWriter,但我得到了相同的结果。我也尝试通过使用临时文件来实施解决方法。问题是File.Copy也具有相同的行为 - 即如果我创建一个临时文件,并且在运行时发生停电,文件将被损坏。

相反,我注意到,即使我在写入文件之后从任务管理器中终止应用程序,该文件也不会被损坏,即使在我称之为Write之后的几秒钟内发生这种情况。

你碰巧知道为什么发生这种情况,也许提出一种解决方法?

+0

你有关闭文件吗?或者你可以把你的代码? – Karuntos

据文档,WriteAllBytes

创建一个新文件时,指定的字节数组写入到文件,然后关闭该文件。如果目标文件已经存在,它将被覆盖。

当然假设是由于文件被写入和关闭了WriteAllBytes,所以它应该在该方法返回后立即可靠地在磁盘上。但由于文件系统缓存策略可能有效,这是一个错误的假设。此外,即使文件系统将缓存刷新到磁盘(并在“直写”文件系统中),并且硬件已返回“成功”指示,也会在硬件缓存之前存在由硬件缓存引起的延迟(尽管时间很短)数据实际上是物理写入磁盘的。

如果您的数据非常重要以至于必须在停电后继续存在,请务必安装UPS。

所有这些都说了,等了一个小时来拔插头,仍然看到你的文件损坏声音怀疑,也许这不是由于filelsystem缓存。您的逻辑中可能存在一个错误,或者内部或外部资源冲突。

我会尝试一些事情。

  1. 设计的测试之后即验证文件的完整性后立即WriteAllBytes回报,或者只要你能合理(最好不是你的应用程序内部,但在另一个applciation运行它旁边)。
  2. 尝试退出程序,等待几分钟,然后拔下插头,看看该文件是否仍然存在损坏。
  3. 如果其他文件也由您的应用程序编写,请验证它们的完整性。他们是否也显示腐败?
  4. 尝试编写一个非常小的Windows测试程序,调用WriteAllBytes并挂起并在运行时拔下插头。该文件是否损坏?
  5. 您的逻辑处理“电源故障”事件吗?这是逻辑损坏你的文件。
  6. 是否存在虚拟机?你是在拔掉主机上的插头,还是在客户机操作系统上模拟停电?

最后,WriteAllBytes是一个广泛使用的方法,不是很复杂。我怀疑这是造成你的问题。

经过一番搜索,我发现我一直在我的硬盘上使用写缓存,因此有些文件在电源故障后不会被写入。 由于性能在我的应用程序中非常关键,我决定让它启用,而我使用FileStreams,在需要时执行fs.Flush(True)。

虽然这通常被认为是一个很好的做法吗?