【问题标题】:Does FileStream.Dispose close the file immediately?FileStream.Dispose 是否立即关闭文件?
【发布时间】:2011-09-15 01:35:50
【问题描述】:

我有一些代码通过使用 MemoryStream.WriteTo() 将 MemoryStream 保存到 FileStream 来写入文件。文件关闭后再次打开以读取一些元数据...

这在大约 80 - 90% 的时间里都有效。另外 20% 我得到一个异常,说该文件“正在被另一个进程使用”。

FileStream.Dispose() 不会同步释放资源吗?我不知道的 Win32 领域是否发生了一些事情?我在 .Net 文档中没有看到任何明显的内容。

【问题讨论】:

  • 这是在 NTFS 上吗?文件是本地文件还是远程共享文件?我怀疑是 Dipose() 没有关闭 HANDLE,我认为您可能正在经历 SAMBA 开发人员所说的 Window 的“繁重的打开模式”(特别是如果在第二次打开时重试 500-1000 毫秒成功)。
  • 它是 NTFS。如果我继续单击窗口上的保存按钮,最终它会保存。我正在处理错误,所以至少它不会崩溃。

标签: c# .net io


【解决方案1】:

尽可能“立即”。由于未完成的写入、更新目录信息的延迟等,很容易出现一些延迟。也可能是防病毒软件检查您更改的文件。

这可能是需要Thread.Sleep(1) 的罕见情况。但为了完全安全,您必须捕获(任何)异常并重试一定次数。

【讨论】:

  • 我想过插入睡眠。这不是我喜欢做的事情,但是,嗯,有时这是最好的解决方案。我也许可以重载一些方法,只传入一个流而不是文件路径。这样我就不必关闭然后再次打开......哦,我的笔记本电脑有 BitLocker 和防病毒。两者都让我的生活如此愉快。
  • 是的,Sleep() 感觉不对。尤其是当@ribram 正确的重试延迟为 500-1000 毫秒时。保持 Stream 打开会更快。还是从memoryStream中获取数据?
  • 我今天看到了类似的东西,是病毒扫描程序造成的
  • 昨天我禁用了我的病毒扫描程序并测试了 20 分钟左右。无法重现它。所以,据我所知,这就是导致问题的原因。今天打算再看一遍。
  • 重构一些代码后,我能够转移到单个文件保存/关闭操作。问题已经消失了。据我所知,这个问题的根源是防病毒软件。
猜你喜欢
  • 2021-09-15
  • 2020-12-05
  • 1970-01-01
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多