.net 断电后的文件损坏

.net 断电后的文件损坏,.net,vb.net,filesystems,system,.net,Vb.net,Filesystems,System,我正在使用File.writealBytes将更改写入文件 如果调用WriteAllBytes后发生断电,则文件始终会损坏。 问题是,这种情况不仅发生在Save函数的执行过程中,甚至在函数的执行完成之后——有时甚至在调用Save后一个小时之后 我尝试使用BinaryWriter,但得到了相同的结果。我还尝试通过使用临时文件实现一种变通方法。问题是File.Copy也有相同的行为-即,如果我创建一个临时文件,并且在运行时的某个时候发生断电,该文件将被损坏 相比之下,我注意到,即使我在写入文件后从任

我正在使用File.writealBytes将更改写入文件

如果调用WriteAllBytes后发生断电,则文件始终会损坏。 问题是,这种情况不仅发生在Save函数的执行过程中,甚至在函数的执行完成之后——有时甚至在调用Save后一个小时之后

我尝试使用BinaryWriter,但得到了相同的结果。我还尝试通过使用临时文件实现一种变通方法。问题是File.Copy也有相同的行为-即,如果我创建一个临时文件,并且在运行时的某个时候发生断电,该文件将被损坏

相比之下,我注意到,即使我在写入文件后从任务管理器中杀死了我的应用程序,文件也不会损坏,即使这种情况发生在我调用Write的几秒钟之后


您是否知道为什么会发生这种情况,并可能建议解决方法?

根据文档

创建新文件,将指定的字节数组写入该文件,然后关闭该文件。如果目标文件已存在,则会覆盖该文件

当然,我们假设,由于文件是由
writealBytes
写入和关闭的,因此在该方法返回后,它应该立即可靠地保存在磁盘上。但这是一个错误的假设,因为文件系统缓存策略可能正在生效。此外,即使文件系统将其缓存刷新到磁盘(在“直写”文件系统中),并且硬件返回了“成功”指示,在数据实际写入磁盘之前,硬件缓存也会导致延迟(尽管是很短的延迟)

如果您的数据非常重要,必须在断电后保存,请确保安装UPS

话虽如此,等了一个小时才拔掉插头,但仍然看到文件损坏,这听起来很可疑,好像这不是由于filelsystem缓存造成的。您的逻辑可能存在缺陷,或者内部或外部资源冲突

我会尝试一些东西

  • 设计一个测试,在
    writealBytes
    返回后立即验证文件的完整性,或者在返回后尽可能快地验证文件的完整性(最好不是在应用程序内部,而是在它旁边运行的另一个应用程序中)
  • 尝试退出程序,等待几分钟,然后拔掉插头,看看该文件是否仍然存在损坏
  • 如果应用程序也编写了其他文件,请验证其完整性。他们是否也表现出腐败
  • 尝试编写一个非常小的windows测试程序,该程序调用
    writealBytes
    ,在运行时挂起并拔下插头。那个文件损坏了吗
  • 您的逻辑是否处理“电源故障”事件?这种逻辑会破坏你的文件吗
  • 是否涉及虚拟机?您是在拔主机上的插头,还是在模拟来宾操作系统上的断电

  • 最后,
    writealBytes
    是一种广泛使用的方法,并不十分复杂。我怀疑是它引起了您的问题。

    根据文件

    创建新文件,将指定的字节数组写入该文件,然后关闭该文件。如果目标文件已存在,则会覆盖该文件

    当然,我们假设,由于文件是由
    writealBytes
    写入和关闭的,因此在该方法返回后,它应该立即可靠地保存在磁盘上。但这是一个错误的假设,因为文件系统缓存策略可能正在生效。此外,即使文件系统将其缓存刷新到磁盘(在“直写”文件系统中),并且硬件返回了“成功”指示,在数据实际写入磁盘之前,硬件缓存也会导致延迟(尽管是很短的延迟)

    如果您的数据非常重要,必须在断电后保存,请确保安装UPS

    话虽如此,等了一个小时才拔掉插头,但仍然看到文件损坏,这听起来很可疑,好像这不是由于filelsystem缓存造成的。您的逻辑可能存在缺陷,或者内部或外部资源冲突

    我会尝试一些东西

  • 设计一个测试,在
    writealBytes
    返回后立即验证文件的完整性,或者在返回后尽可能快地验证文件的完整性(最好不是在应用程序内部,而是在它旁边运行的另一个应用程序中)
  • 尝试退出程序,等待几分钟,然后拔掉插头,看看该文件是否仍然存在损坏
  • 如果应用程序也编写了其他文件,请验证其完整性。他们是否也表现出腐败
  • 尝试编写一个非常小的windows测试程序,该程序调用
    writealBytes
    ,在运行时挂起并拔下插头。那个文件损坏了吗
  • 您的逻辑是否处理“电源故障”事件?这种逻辑会破坏你的文件吗
  • 是否涉及虚拟机?您是在拔主机上的插头,还是在模拟来宾操作系统上的断电

  • 最后,
    writealBytes
    是一种广泛使用的方法,并不十分复杂。我怀疑是它引起了您的问题。

    经过一番搜索后,我发现我一直在硬盘上使用写缓存,因此一些文件在断电后无法写入。 由于性能在我的应用程序中非常关键,我决定让它保持启用状态,而是在需要时使用执行fs.Flush(True)的文件流


    但这通常被认为是一种好的做法吗

    经过一番搜索,我发现我一直在硬盘上使用写缓存,因此一些文件在断电后无法写入。 由于性能在我的应用程序中非常关键,我决定让它保持启用状态,取而代之的是在nee时使用执行fs.Flush(True)的文件流