FileSystemWatcher工作完成了吗?

时间:2011-01-11 21:31:04

标签: .net disk filesystemwatcher

我在本地文件系统目录上设置了一个FsWatcher。我只想知道何时将文件添加到目录中,以便将它们移动到另一个文件系统。我似乎能够检测到第一个文件何时进入,但实际上我想知道来自给定复制操作的所有文件何时完成。

如果我使用Windows资源管理器将文件从一个目录复制到另一个目录,资源管理器会告诉我传输中还剩下n秒,因此虽然每个文件的开始传输和结束传输都有一些活动,似乎所有文件的开始传输和结束传输都有一些东西。

我想知道是否有类似于.NET Framework的功能。我想知道“所有”文件何时进入,而不只是“交易”中的单个文件。如果没有任何东西被烘烤,也许我应该想出某种等待/反击,以便只在工作“完成”时进行我的活动。

不确定我是否对这一点有100%的感觉,请任何人发表评论。

感谢。

3 个答案:

答案 0 :(得分:3)

我过去实现此功能的方法是使用带有特殊名称的“标记”文件,例如'结束'。此文件始终是最后写入的文件,并用作多文件事务完成时的指示符。如果只有一个线程正在编写这些文件集,那么这可以正常工作。

如果有许多线程,每个线程可能正在写一组文件,那么你需要以某种方式将每个'end'文件与它标记的文件集相关联。一种方法是在文件名中包含GUID(或其他一些唯一标识符),例如

{ GUID1 .file1.bin, GUID1 .file2.bin, GUID1 .end}

{ GUID2 .file1.bin, GUID2 .file2.bin, GUID2 .end}

另一种方法是将每组中的所有文件压缩成一个ZIP文件,这样您只需要查看单个文件。

答案 1 :(得分:1)

没有文件副本的事务。您只能在目录中查看单个文件更改。

资源管理器可以这样做,因为它知道你想要做什么(将这些x文件从这里复制到这里)。

你甚至不知道什么时候写这个文件(或更普遍的修改)。您必须尝试独占锁定文件,以便知道您是唯一访问该文件的人。

AdamRalph提到的.end文件技巧是实际接近你想要做的唯一技巧。

HTH

马里奥

答案 2 :(得分:0)

如何编写一个文件,指明要添加的文件列表作为第一步,应用程序选择它,读取它然后等待要写入的文件。写入最终文件后,您可以将它们打包并发送出去。这样,如果启动了多个“交易”,则您没有“结束文件”踩到彼此的脚趾。为指标文件指定一个已知的模式名称,以便在常规文件中不太可能发生,并提供一些方法,可以在相似的时间发生多个指标文件。

如果我要实现这样的东西,我可能会使用某种类型的文件名,例如~<ANOTHER-UNIQUE-GUID>.tmp我的文件系统观察者会看到该格式名称的单个文件,这反过来告诉另一个文件系统观察者等待在里面列出的文件。文件移出后,可以删除临时文件。

这种方法可以很容易地进行操作,这样每个观察者都不会互相踩踏,转移/删除其他观察者正在处理的文件。

如前所述,将文件压缩到单个存档中并使用它,在目的地解压缩它们可能更有效。