使用FileSystemWatcher监视目录

che*_*man 95 c# io filesystemwatcher copy winforms

我正在使用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();
}
Run Code Online (Sandbox Code Playgroud)

che*_*man 135

问题是通知过滤器.该程序试图打开一个仍在复制的文件.我删除了除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;
}
Run Code Online (Sandbox Code Playgroud)

  • 嗨,我使用的是这种方法,但是当我复制文件时,会引发两次事件:一次是将文件创建为空(复制开始),另一次是复制完成。如何避免此重复事件,任何过滤器都可以在没有自定义控件的情况下处理该事件? (2认同)

nvo*_*igt 25

你没有提供文件处理代码,但我认为你在第一次写这样的事情时犯了同样的错误:filewatcher事件将在文件创建后立即引发.但是,文件完成需要一些时间.例如,文件大小为1 GB.该文件可能由另一个程序(Explorer.exe从某处复制)创建,但完成该过程需要几分钟.事件在创建时引发,您需要等待文件准备好复制.

您可以在循环中使用函数等待文件准备就绪.


小智 24

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

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.
}
Run Code Online (Sandbox Code Playgroud)

  • `watcher`变量保持活着(不是垃圾收集),因为他订阅了Changed事件. (15认同)