我有一个宠物项目,我正在研究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"
。
我确信我在某处的文档中遗漏了一些简单的东西。
答案 0 :(得分:2)
你是对的,你面临的问题实际上是忘记设置财产。
如果设置watcher.IncludeSubdirectories = true;
,即使在更深层次上,您也会收到有关文件删除的通知。
在默认模式下,FileSystemWatcher
仅记录对给定目录的更改。子目录被建模类似于文件的目录条目,其中的任何添加/删除都只是直接报告给子目录(如果你检查了{{1}中的FileSystemEventArgs.ChangeType
属性,你会看到处理程序)。
即使打开子目录监控,您仍会获得OnChanged
目录的更改事件(FileSystemEventArgs.ChangeType = WatcherChangeTypes.Changed
),因为当您删除其中的文件时,它也会被修改。这是对文件的删除事件的补充。
我的测试代码:
subdir