高级 FileSystemWatcher






4.56/5 (24投票s)
这是一个对 FileSystemWatcher 对象的进阶操作。
引言
微软的 FileSystemWatcher
类相当酷,我用它来查看何时有新文件准备好被处理,而且它工作得很好。但是,FileSystemWatcher
确实有它的局限性。促使我编写此代码和本文的唯一限制是,FileSystemWatcher
无法告知客户端某个文件夹已不再存在。
在我的一个程序中,我正在监视一个网络文件夹。该程序启动后,会 24x7x365 全天候运行。它应该检测新文件,然后其他进程根据文件的类型导入或导出该文件。检测文件的过程至关重要,需要持续运行并能够在发生错误后恢复。
我们上周遇到了网络问题,并且 FileSystemWatcher
目前没有办法通知用户或应用程序我们正在监视的文件夹/路径已不再可用。而且,在网络路径恢复后,FileSystemWatcher
也不再继续监视文件夹,并且不会抛出任何错误或指示网络路径不可用,或者它已被恢复。
问题
当发生网络中断时,FileSystemWatcher
没有任何事件会触发,告诉应用程序无法访问该文件夹/路径。而且,一旦网络恢复,它也没有任何恢复方法。
解决方案
我所做的是继承了基类 FileSystemWatcher
,并添加了一些自定义事件、一个属性和一个计时器。通过继承基类,保留了所有原始功能。通过添加事件、计时器和属性,我们可以使用 timer_elapsed
事件来查看网络路径是否存在。该属性是计时器的间隔,因此用户可以告诉新类应该多久检查一次网络是否仍然可用。如果用户未指定间隔,则使用默认的 100 毫秒间隔。
我添加了两个新的公共事件:NetworkPathAvailable
和 NetworkPathUnavailable
。在代码中,用户将在这些事件中查找以确定网络路径是否可用,并且代码可以采取适当的措施来继续工作或优雅地停止。
AdvancedFileSystemWatcher
类可以在 .NET 1.1 或 2.0 中使用;我提供的代码适用于 VS2005 和 .NET 2.0,但您可以在任何版本的 .NET 中使用该类。
该代码还包含一个基本的 Windows Form,它具有您可以设置的文件夹路径,以及一个多行文本框,该文本框将显示文件夹文件事件的发生情况。您还将看到我如何使用 AdvancedFileSystemWatcher
在网络中断时优雅地终止监视器,以及应用程序如何在网络再次可用时优雅地重新创建监视器。您可以添加代码以向系统管理员发送一封电子邮件,说明网络已中断,但这部分代码由您自行处理。
我欢迎对这段代码的任何评论或问题。我是一个早上快速写出来的,所以没有经过充分的测试,并且我不对该代码完美运行负责。请自行承担风险 :)
祝您平安,编码愉快。