c# - 在 C# 中使用 FileSystemWatcher 确定复制/写入进度

标签 c# .net file file-io filesystemwatcher

上下文:一组运算符(operator)在第三方应用程序中处理大小高达 10GB 的大型批处理文件。每个文件包含数千张图像,每处理 50 张图像后,他们点击保存按钮。工作场所的电源不可靠,如果在保存期间断电,整个文件都会损坏。为了克服这个问题,我正在编写一个使用 FileSystemWatcher 的小实用程序来检测保存并创建备份,以便可以恢复它而无需重新处理整个批处理。

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

在保存操作期间创建文件备份达不到目的,因为它损坏了备份文件。

问题:

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

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

最佳答案

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

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

如果您有权访问写入文件的应用程序,则可能能够解决此问题。如果做不到这一点,您可能能够获得具有上次修改日期的内容,仅当文件在特定时间段内未被修改时才创建备份,但这必然会出现错误且不可靠。

关于c# - 在 C# 中使用 FileSystemWatcher 确定复制/写入进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12500927/

相关文章:

c++ - 你如何计算 C++ 中文本文件每一行中的单词数?

android - Kotlin如何获取和打开视频

c# - ReaderWriterLock 中的排序

c# - 如何在不同的控件中显示列表框选定项的属性

c# - 从两个字典中删除公共(public)键并将剩余部分添加到新的第三个字典中?

c# - 异步方法是否必须使用 "await"关键字?

c# - MEF ImportMany 类型参数 : elegant solution?

c# - 为什么Unity拦截抓不到Exception?

.net - 为 x86 .NET 开发下载哪个 Visual Studio 2008 版本?

php - .htaccess 启用 php 文件信息扩展