C#:使用FileSystemWatcher监视复制或移动的文件

时间:2010-08-09 00:11:52

标签: c# .net filesystems filesystemwatcher

我在这里和整个网络上遇到过几个“解决方案”,但似乎没有一个适合该法案。

我要做的是让应用程序监视新文件的文件夹(通过创建,移动或复制)并对这些对象执行操作。就是这种情况,我转向FileSystemWatcher类来执行此操作。

问题是文件FileSystemWatcher.Created事件在创建整个文件之前被触发(最明显是通过大文件的副本看到的)。

是否有任何方法可以在文件创建结束时触发此事件而不是从头开始?我尝试过FileSystemWatcher.NofityFilter属性的各种组合但没有成功。

提前致谢! :)

4 个答案:

答案 0 :(得分:6)

我已经针对这种情况使用了几种解决方案。

  1. 如果您可以使用文件的创建者并对文件使用重命名方案。例如。在创建时将文件创建为 __名称_ ,并在流程结束时将其重命名为 名称 ,该事件将触发并且您已完成文件

  2. 当触发器触发时,检查是否可以对文件进行独占的只读锁定。如果可以,则已完成对文件的写入操作。 (我在另一个问题Keep settings in sync between forms application and windows service (or any n-tier, really)

  3. 中写了一些关于此的内容

    您可以将类似#2的内容集成到您的Changed事件中,然后您将获得结果。

答案 1 :(得分:1)

嗯有趣的问题。我在观看大文件时从未使用过该对象。做了一点搜索,似乎一个解决方案是监控Changed事件。因为一旦文件完成复制(触发创建后),也会抛出更改的事件(导致文件大小增加)

我在此处阅读的更多细节:http://social.msdn.microsoft.com/forums/en-US/vblanguage/thread/f84bb7c8-b7d5-44da-b0f3-6d1a70415d11/

答案 2 :(得分:1)

我知道,我要告诉你的并不优雅。我还要监控从不同地方到达的文件,其中一些文件很大而且很小。我们发现,FileSystemWatcher不可靠用于此目的。如果你想100%确定,你可以使用Timer类及其Elapsed事件偶尔检查一次。

答案 3 :(得分:0)

您需要在文件创建后跟踪文件的关闭,我怀疑FileSystemWatcher是否可以。 如果您没有找到使用FileSystemWatcher的解决方案,请查看我们的CallbackFilter产品,该产品可让您实时跟踪所有操作。