【问题标题】:Determining copy/write progress with FileSystemWatcher in C#在 C# 中使用 FileSystemWatcher 确定复制/写入进度
【发布时间】:2012-09-19 18:44:59
【问题描述】:

背景:一组操作员在第三方应用程序中处理最大为 10GB 的大型批处理文件。每个文件包含数千张图像,每处理 50 张图像后,他们点击保存按钮。工作场所的电源不可靠,如果在保存过程中断电,整个文件就会损坏。为了克服这个问题,我正在编写一个使用 FileSystemWatcher 的小实用程序来检测保存并创建备份,以便无需重新处理整个批次即可恢复它。

问题:FileSystemWatcher 在报告事件方面做得非常好,但有一个我无法查明的问题。由于监控的文件很大,保存过程需要几秒钟。我希望在保存操作完成后收到通知。我怀疑每次将文件缓冲区刷新到磁盘时,都会触发不需要的事件。无论保存是否在进行中,该文件仍处于锁定状态以进行写入,因此我无法确定。

在保存操作期间创建文件的备份会破坏目的,因为它会损坏备份的文件。

问题:

  • 有没有办法使用 FileSystemWatcher 在保存操作完成后收到通知?
  • 如果没有,我还能如何可靠地检查文件是否仍在被写入?

替代方案:也欢迎任何替代建议。

【问题讨论】:

  • 看看这篇文章,也许有一种方法可以通过使用线程来做你想做的事情。但基于你想做的事情,你不能只用一个FileSystemWatcher..csharp-codesamples.com/2009/02/…
  • 谢谢。您应该将此作为答案发布。带有条件取消令牌的线程队列似乎是一种方式。如果在复制期间检测到更新,则该令牌可用于取消复制操作。

标签: c# .net file file-io filesystemwatcher


【解决方案1】:

真的没有直接的方法来做你想做的事。文件系统本身不知道保存操作何时完成。从逻辑上讲,您可能将其视为一系列保存,因为用户多次单击“保存”按钮,但这不是文件系统所看到的。只要应用程序锁定了文件以进行写入,就文件系统而言,它仍处于保存过程中。

如果你仔细想想,这是有道理的。如果应用程序保留对文件的写访问权限,文件系统如何知道文件何时处于“损坏”状态,何时不处于“损坏”状态?只有写入文件的应用程序知道。

如果您有权访问写入文件的应用程序,您或许能够解决此问题。如果做不到这一点,你可能会得到最后修改日期的东西,只有在文件在一段时间内没有被修改的情况下才创建备份,但这肯定是错误的和不可靠的。

【讨论】:

  • 伤心。您的最后一段似乎是唯一可行的选择。没有连接到同样不可靠的第三方应用程序。文件系统应该支持某种原子性。
  • 技术上确实如此——文件锁是原子性。当你锁定一个文件时,你是在告诉文件系统它在不断变化并且不完整。当您解锁它时,文件系统就知道它处于“正确”状态。这是第三方应用程序的错误,它在保存之间保持句柄锁定。
  • 我同意,尽管在某些情况下可以证明无条件锁定是合理的。我的意思是,文件系统本身应该促进原子友好的 API 以鼓励负责任的开发,而不是仍然流行的“我做的,因为它是专有的”方法。我之所以这么说是因为在大多数情况下,原因是开发人员的决定而不是所有者的结果。
  • 我100%同意你的观点。我想我是少数真正期待 WinRT 下的新开发模型和 API 的 Windows 开发者之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 2015-12-12
  • 2017-02-18
  • 1970-01-01
  • 2015-12-17
相关资源
最近更新 更多