FileSystemWatcher在没有文件名的情况下触发事件

时间:2018-01-11 18:39:22

标签: c# .net filesystemwatcher

我有一个宠物项目,我正在研究FileSystemWatcher让我烦恼的地方。

这是初始化代码:

for (var xx = 0; xx < _roots.Count; xx++)
{
    var watcher = new FileSystemWatcher();
    var root = _roots[xx];

    watcher.Path = root;
    // watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
    watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName;

    watcher.Filter = "*.*";
    watcher.Changed += new FileSystemEventHandler(OnChanged);
    watcher.Created += new FileSystemEventHandler(OnChanged);
    watcher.Deleted += new FileSystemEventHandler(OnChanged);
    watcher.Renamed += new RenamedEventHandler(OnRenamed);

    watcher.EnableRaisingEvents = true;

    _rootWatchers.Add(watcher);
}

让我们说我们正在观看“c:\ root”的根目录,并且有一个子目录“c:\ root \ subdir”,其中包含一个名为“file1.txt”的文件。

观察者已启动并正在运行,我删除了“file1.txt”。调用处理程序并检查FileSystemEventArgs

的值

我希望e.Name == "file1.txt"e.FullPath == "c:\\root\\subdir\\file1.txt

实际值为"subdir""c:\\root\\subdir"

我确信我在某处的文档中遗漏了一些简单的东西。

1 个答案:

答案 0 :(得分:2)

你是对的,你面临的问题实际上是忘记设置财产。

如果设置watcher.IncludeSubdirectories = true;,即使在更深层次上,您也会收到有关文件删除的通知。

在默认模式下,FileSystemWatcher仅记录对给定目录的更改。子目录被建模类似于文件的目录条目,其中的任何添加/删除都只是直接报告给子目录(如果你检查了{{1}中的FileSystemEventArgs.ChangeType属性,你会看到处理程序)。

即使打开子目录监控,您仍会获得OnChanged目录的更改事件(FileSystemEventArgs.ChangeType = WatcherChangeTypes.Changed),因为当您删除其中的文件时,它也会被修改。这是对文件的删除事件的补充。

我的测试代码:

subdir