使用 FileSystemWatcher 监视目录

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

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

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

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


private void OnChanged(object source, FileSystemEventArgs e)
{
//Copies file to another directory.
}


public void Dispose()
{
// avoiding resource leak
watcher.Changed -= OnChanged;
this.watcher.Dispose();
}
239982 次浏览

您没有提供文件处理代码,但是我假设您犯了每个人在第一次编写这样的代码时都会犯的错误: 文件一旦创建,就会引发文件监视器事件。然而,完成这个文件需要一些时间。以1GB 的文件大小为例。这个文件可能是由另一个程序创建的(Explorer.exe 从某个地方复制它) ,但是完成这个过程需要几分钟的时间。事件在创建时引发,您需要等待文件准备好被复制。

通过在循环中使用 this函数,可以等待文件准备就绪。

原因可能是,Watcher 被声明为方法的局部变量,并且在方法完成时被垃圾收集。您应该将其声明为类成员。试试以下方法:

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.
}

问题在于通知过滤器。程序试图打开一个仍在复制的文件。除了 LastWrite,我删除了所有的通知过滤器。

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