我们正在使用File。WriteAllBytes向磁盘写入数据。但是,如果在我们关闭文件的时候发生了重新启动,windows就会将该文件添加为null。这似乎发生在Windows 7上。所以当我们回到文件时,我们看到文件中有空值。有办法防止这种情况发生吗?
取决于你想要什么行为;你可以像0A0D建议的那样把它放在UPS里;但除此之外,你还可以使用Windows的Vista+事务性NTFS功能。这允许您自动写入文件系统。所以在你的情况下;nothing会被写入,而不是不正确的数据。它还不是。net框架的直接组成部分;但是在网上可以找到很多管理包装器。
有时候没有数据比错误的数据要好。当应用程序再次启动时;它可以看到文件丢失;它可以从中断的地方"继续"下去;
根据您的评论,在写文件时没有保证—特别是在写文件期间断电时。你最好的办法是把电脑放在不间断电源上。如果您能够创建自动恢复机制,如Microsoft Office产品,那么这将防止数据完全丢失,但它不会修复丢失的数据在断电时。
我认为这是一个致命的异常(突然断电)。您对此无能为力,通常,试图处理它们只会使事情变得更糟。
我不得不处理类似的事情;本质上是一个在Windows上运行的嵌入式系统,它的预期是电源可能随时被关闭。
在实践中,我的理解是,在断电前不到10秒将文件写入磁盘意味着文件将被损坏。(为了安全起见,我在代码中使用了30秒)。
我不知道有什么方法可以从代码中保证文件已经完全关闭,刷新到磁盘,并且磁盘硬件已经完成了写操作。除了知道10(或30)秒已经过去。这不是一个很令人满意的情况,但就是这样。
以下是我在实际嵌入式项目中使用的一些指针…
- 使用校验和和备份文件系统。
- 校验和:在您编写的任何文件的末尾,包括校验和(如果它是一个自定义XML文件,那么可能包括某种类型的
<checksum .../>
标记)。然后在读取时,如果校验和标签不存在,或者与数据不匹配,那么您必须拒绝文件损坏。 - 备份:每次写入文件时,将副本保存到两个备份之一;例如A和B。如果磁盘上存在A,但小于30秒,则将其复制到B。然后在读取时,先读取原始文件。如果损坏,则读取A,如果损坏,则读取b。
- 如果它是嵌入式系统,您需要在启动时在您要写入的驱动器上运行DOS命令"chkdsk/F"。因为如果你得到了损坏的文件,那么你也将得到一个损坏的文件系统。
- NTFS磁盘系统比FAT32具有更强的抗错误能力。但是我相信NTFS磁盘也需要更多的时间来完全刷新它们的数据。我尽量使用FAT32。
最后的想法:如果你真的在使用一个嵌入式系统,在windows下,你会做得很好,了解更多关于windows嵌入式,和增强型写过滤系统