【问题标题】:.NET File.Copy wait for finalization.NET File.Copy 等待完成
【发布时间】:2013-09-13 13:45:24
【问题描述】:

我有一个用户界面,可以将文件复制到带有进度条的 U 盘。

当在 API 级别完成 File.Copy 时,我会向用户显示一条成功消息。问题是,当我显示成功消息时,用户拔出驱动器,而 Windows 仍在“完成”。在完成之前拔出驱动器会调用文件不显示或损坏。

问题。

如何使 File.Copy 锁定,直到驱动器完全完成?这些记忆棒可能是 FAT32 或 NTFS(很可能是我们设备上的大文件)。

【问题讨论】:

  • 我假设“最终化”是指写入缓存被刷新并且文件句柄关闭?如果是这样,您也许可以自己控制文件副本,以便获得对流的引用。然后你可以forcibly flush to disk (.Net 4+) 失败,你可以调用Win32API 来强制操作系统刷新缓存

标签: c# .net file-io


【解决方案1】:

如果可能,不使用 File.Copy(),如何切换到 StreamWriter 或 BinaryWriter 并使用 Flush() 方法? StreamWriter FlushBinaryWriter Flush 应该强制所有内容尽快写入磁盘。

【讨论】:

  • 你确定这会起作用吗?在某些情况下,当我们只在流上调用 flush 时,我们仍然会遇到问题,因为数据仍在某个“磁盘缓存”中?在我们直接在卷的句柄上调用 FlushFileBuffers 之后(见备注),数据真的被写入了磁盘。
  • 仅当您调用 Stream.Flush(True) (.Net4+) 时才为真。见这里:stackoverflow.com/a/3992428/156755
  • @Basic 啊,这解释了为什么我们必须调用 FlushFileBuffers
  • 很高兴知道这一点。希望 OP 使用 .NET >= 4,因为这似乎是一种快速、简单的方法来处理冲洗 :)
【解决方案2】:

通过 PInvoke 调用 WinApi FlushFileBuffers 功能。 或者在消息中告诉用户他们必须正确弹出 U 盘。

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    • 2020-07-04
    • 2011-12-28
    • 2011-09-08
    • 1970-01-01
    • 2011-10-14
    相关资源
    最近更新 更多