FileSystemWatcher没有触发事件

gwi*_*003 25 c# filesystemwatcher

出于某种原因,我FileSystemWatcher没有发动任何事件.我想知道在我的目录中创建,删除或重命名新文件的任何时间._myFolderPath正确设置,我已经检查过了.

这是我目前的代码:

public void Setup() {
    var fileSystemWatcher = new FileSystemWatcher(_myFolderPath);
    fileSystemWatcher.NotifyFilter = NotifyFilters.LastAccess | 
      NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;

    fileSystemWatcher.Changed += FileSystemWatcherChanged;
    fileSystemWatcher.Created += FileSystemWatcherChanged;
    fileSystemWatcher.Deleted += FileSystemWatcherChanged;
    fileSystemWatcher.Renamed += FileSystemWatcherChanged;

    fileSystemWatcher.Filter = "*.*";
    fileSystemWatcher.EnableRaisingEvents = true;
}

private void FileSystemWatcherChanged(object sender, FileSystemEventArgs e)
{
    MessageBox.Show("Queue changed");
    listBoxQueuedForms.Items.Clear();
    foreach (var fileInfo in Directory.GetFiles(_myFolderPath, "*.*", SearchOption.TopDirectoryOnly))
    {
        listBoxQueuedForms.Items.Add(fileInfo));
    }
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*ris 24

您似乎在setup方法中将FileSystemWatcher创建为局部变量.这当然会在方法结束时超出范围,并且很可能在此时进行整理,从而移除手表.

尝试在持久化的位置创建FSW(例如程序级变量)并查看是否对您进行排序.

  • 我将“FileSystemWatcher”移至私有局部变量,现在它似乎工作得更加一致。 (2认同)
  • 您之后只能在有限的时间内编辑评论(我认为5分钟).很高兴有帮助.FSW需要注意的另一点是,它们无法在网络驱动器上触发事件.从上面的评论中你现在不相关,但如果你想做的话,那就是一个很大的问题.:) (2认同)

MoM*_*oMo 24

我的问题是我期望某些行动导致FileSystemWatcher Changed事件发生.例如,将文件(单击并拖动)从桌面移动到监视位置不会引发事件,而是复制现有文件并粘贴其新副本(通过在文件系统中创建新文件而不是简单地移动现有的一个)导致Changed事件被提出.

我的解决方案是将每一个添加NotifyFilter到我的FileSystemWatcher.这样我FileSystemWatcher就可以通知我的所有情况都会收到通知.

请注意,对于特定情况,哪些过滤器会通知您,这并不完全直观/明显.例如,我预计,如果我包括在内FileName,我会收到有关现有文件名称的任何更改的通知......而不是Attributes似乎处理这种情况.

watcher.NotifyFilter = NotifyFilters.Attributes |
    NotifyFilters.CreationTime |
    NotifyFilters.FileName |
    NotifyFilters.LastAccess |
    NotifyFilters.LastWrite |
    NotifyFilters.Size |
    NotifyFilters.Security;
Run Code Online (Sandbox Code Playgroud)


Luc*_*ler 9

使用此setter启用触发器:

watcher.EnableRaisingEvents = true;
Run Code Online (Sandbox Code Playgroud)

  • 哦,我非常感谢你.令我惊讶的是事件需要一面旗帜. (5认同)
  • @theberserker,我认为默认为 false 是最明智的选择,因为人们可能想在给定时间设置观察者,但只有在完成其他设置工作后才启用它。 (4认同)
  • 哦,哇...这花了我一个小时的时间:/奇怪的选择是默认将其设置为“ false”。这些事件不是最主要的原因,为什么您首先要使用`FileSystemWatcher`? (3认同)