【问题标题】:File close issue windows文件关闭问题窗口
【发布时间】:2011-10-03 19:51:49
【问题描述】:

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

【问题讨论】:

  • 你的意思是空字节比如0x00?
  • 可以说是温和的重启吗,就像正常的“关机”或“重启”一样?还是突然断电?在后一种情况下,可能没有解决方案。
  • @Detmar - 不幸的是突然断电。如果是这样,我的选择是什么?。
  • Prashant:使用事务性 NTFS 确保所有数据都已写入或根本不写入。当然,前提是您可以忍受在发生故障时不写入任何数据。
  • 我从未尝试过,但您也可以使用完全无缓冲的流。 stackoverflow.com/questions/122362/…

标签: c# windows-7


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    根据您的 cmets,在写入文件时无法保证 - 特别是如果您在文件写入期间断电。最好的办法是将 PC 置于不间断电源上。如果您能够创建自动恢复机制,例如 Microsoft Office 产品,那么这将防止数据完全丢失,但不会在断电时修复丢失的数据。

    【讨论】:

      【解决方案3】:

      我认为这是一个致命的例外情况(突然断电)。对此您无能为力,而且通常情况下,试图处理它们只会让事情变得更糟。

      【讨论】:

        【解决方案4】:

        我不得不处理类似的事情;本质上是一个在 Windows 上运行的嵌入式系统,预期电源可能随时关闭。

        在实践中,我的理解是,在断电前不到 10 秒写入磁盘的文件意味着该文件将被损坏。 (为了安全起见,我在代码中使用了 30 秒)。

        我不知道有任何方法可以从代码中保证文件已完全关闭、刷新到磁盘以及磁盘硬件已完成写入。除非知道 10(或 30)秒已经过去。这不是一个非常令人满意的情况,但确实如此。

        以下是我在实际嵌入式项目中使用的一些指针...

        • 使用校验和和备份文件系统。
        • 校验和:在您编写的任何文件的末尾,包含校验和(如果它是自定义 XML 文件,则可能包含某种<checksum .../> 标记)。然后在读取时,如果校验和标签不存在,或者与数据不匹配,那么您必须将文件视为损坏而拒绝。
        • 备份:每次写入文件时,将副本保存到两个备份之一;说 A 和 B。如果 A 存在于磁盘上但不到 30 秒,则改为复制到 B。然后在阅读时,首先阅读原始文件。如果损坏,则读取 A,如果损坏则读取 B。

        还有

        • 如果是嵌入式系统,则需要在启动时在写入的驱动器上运行 DOS 命令“chkdsk /F”。因为如果您得到损坏的文件,那么您也将得到一个损坏的文件系统。
        • NTFS 磁盘系统旨在比 FAT32 更可靠地防止错误。但我相信 NTFS 磁盘也可能需要更多时间来完全刷新数据。我尽可能使用 FAT32。

        最后的想法:如果你真的在使用嵌入式系统,在 windows 下,你最好了解更多关于 Windows Embedded 和增强型写入过滤器系统的信息。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多