使用FileSystemWatcher来监视一个目录

我正在使用Windows窗体应用程序来监视一个目录,并将其中放入的文件移动到另一个目录。

目前它会将文件复制到另一个目录,但是当添加另一个文件时,它只会以没有错误信息结束。 有时它会在第三个文件结束之前复制两个文件。

这是因为我使用Windows窗体应用程序而不是控制台应用程序? 有没有办法阻止程序结束并继续观看目录?

private void watch() { FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = path; watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; watcher.Filter = "*.*"; watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.EnableRaisingEvents = true; } private void OnChanged(object source, FileSystemEventArgs e) { //Copies file to another directory. } 

问题是通知filter。 该程序试图打开一个仍在复制的文件。 我删除了LastWrite以外的所有通知filter。

 private void watch() { FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = path; watcher.NotifyFilter = NotifyFilters.LastWrite; watcher.Filter = "*.*"; watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.EnableRaisingEvents = true; } 

你没有提供文件处理代码,但是我认为你在第一次写这样的事情的时候犯了同样的错误:一旦文件被创build,filewatcher事件就会被激发。 但是,文件需要花费一些时间才能完成。 以1 GB的文件大小为例。 该文件可能由另一个程序(Explorer.exe从某处复制)创build,但完成该过程需要几分钟的时间。 事件在创build时提出,您需要等待文件准备好被复制。

您可以通过循环使用此函数来等待文件准备就绪。

原因可能是观察者被声明为方法的局部variables,并且在方法结束时被垃圾收集。 你应该声明它是一个类的成员。 尝试以下操作:

 FileSystemWatcher watcher; private void watch() { watcher = new FileSystemWatcher(); watcher.Path = path; watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName; watcher.Filter = "*.*"; watcher.Changed += new FileSystemEventHandler(OnChanged); watcher.EnableRaisingEvents = true; } private void OnChanged(object source, FileSystemEventArgs e) { //Copies file to another directory. }