FileSystemWatcher中的FileNotFoundException

时间:2010-10-20 10:30:59

标签: c# .net file exception file-watcher

我在目录上使用FileSystemWatcher并添加了其事件处理程序,设置了EnableRaisingEvents=true;IncludeSubdirectories=false;并添加了NotifyFilters

在运行应用程序时,如果我在指定目录中创建新文件夹,那么我

  

FileNotFoundException:“读取目录时发生错误”。   System.IO.FileSystemWatcher.StartRaisingEvents()   System.IO.FileSystemWatcher.set_EnableRaisingEvents(布尔值)

问题的根本原因是什么?

什么是StartRaisingEvents()

3 个答案:

答案 0 :(得分:3)

这通常是因为FileSystemWatcher可能不可靠。获得事件时,文件夹可能不会“完全”存在。在实际执行IO操作之前,您可能需要以足够的暂停重试并执行各种Directory.Exists()检查。

答案 1 :(得分:1)

我遇到了同样的问题,最后我发现问题出在路径上。

Directory.Exist()给出了目录存在的答案...即使路径在字符串末尾有一个空字符,但FileSystemWatcher无法管理它。 显然,Directory.Exist()修剪了路径,但观察者却没有。在我的情况下删除空字符解决问题。

希望它可以帮到某个人。

答案 2 :(得分:0)

出于愚蠢,我在思考之前搜索了它。

就我而言,Path 是在之后 EnableRaisingEvents 定义的。

例如不会抛出异常:

FileSystemWatcher watcher = new FileSystemWatcher();
watcher.Path = @"C:\";
//...
watcher.EnableRaisingEvents = true;

这将:

FileSystemWatcher watcher = new FileSystemWatcher();
watcher.EnableRaisingEvents = true;
//...
watcher.Path = @"C:\";

所以。因为我喜欢快速失败而不是让下一个弄清楚到底发生了什么,所以我在路径声明后修改了它:

var watcher = new FileSystemWatcher();
watcher.Path = @"C:\Users\me";
if (string.IsNullOrWhiteSpace(watcher.Path))
    throw new InvalidOperationException($"You must define a path.");
if (!Directory.Exists(watcher.Path))
    throw new InvalidOperationException($"Directory {watcher.Path} does not exist.");
watcher.EnableRaisingEvents = true;

愚蠢的问题,但至少我给出了一些古怪的快速失败的解决方案。