某次因为用到FileSystemWatcher这个类,简单的测试后发现,对于任何被监视的文件,只要该文件改动过,会触发2次Changed事件,这个时候,绝大多数人会google,msdn...当然也包括我,找了一大圈回来之后,会发现人云亦云的“解决方案”是用Timer,个人对Timer没啥好感,所以一旦看到此类解决方案(就算它是吧...)我马上就会关掉该tab,而且我也实在想不通这些人怎样才能把Timer的预设时间拿捏到“精确”的程度,譬如说有这样一个场景:
从一个目录拷贝一个大文件到监视目录,例如XXX.rm,好几百M的大家伙,这时候这个解决方案基本上就废了
在不想弄清楚FileSystemWatcher这个类的内部实现机制前提下,我们需要对它的外部行为做全面的测试,大概有这样几个用例:(当然,在被监视目录下操作)
- 新建文件
- 拷贝小文件
- 拷贝大文件
- 对某文件改动
在完成这些测试后,我们会发现,无论做任何操作,在输出的事件列表中最后2个肯定是Changed,第一个可能是Created,可能是Renamed...
于是,我们可以通过捕获2次的Changed事件,对一个文件的改动做出判别,这样的解决方案才是正确的,ok,给出我的代码
怎么使用呢?很简单
string dir = "C:\\";
string[] files = Directory.GetFiles(dir);
ChangedFile cf = new ChangedFile(files, dir, "*.*");
cf.OnFileChanged += new EventHandler<WatchFileChangeEventArgs>(cf_OnFileChanged);
cf.Run();
string[] files = Directory.GetFiles(dir);
ChangedFile cf = new ChangedFile(files, dir, "*.*");
cf.OnFileChanged += new EventHandler<WatchFileChangeEventArgs>(cf_OnFileChanged);
cf.Run();
这样就可以保证只会触发一次啦