繁体   English   中英

文件关闭问题 windows

[英]File close issue windows

我们正在使用 File.WriteAllBytes 将数据写入磁盘。 但是,如果在我们关闭文件时重新启动,windows 会将 null 添加到文件中。 这似乎发生在 Windows 7 上。因此,一旦我们回到文件,我们会在文件中看到空值。 有没有办法防止这种情况。 windows 是否在一定时间后关闭其内部手柄,是否可以立即强制关闭?

取决于你想要什么行为; 您可以按照 0A0D 的建议将其放入 UPS; 但除此之外,您还可以使用 Windows 的 Vista+ Transactional NTFS功能。 这允许您以原子方式写入文件系统。 所以在你的情况下; 什么都不会写,而不是不正确的数据。 它还不是 .NET 框架的直接一部分; 但是网上有很多托管包装器。

有时没有数据比错误的数据好。 当您的应用程序再次启动时; 可以看到文件丢失了; 它可以从中断的地方“继续”; 取决于你的应用程序做什么。

根据您的评论,写入文件时无法保证 - 特别是如果您在文件写入期间断电。 最好的办法是将 PC 置于不间断电源上。 如果您能够创建自动恢复机制,例如 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 Embedded 和增强型写入过滤器系统的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM