与其他几个人一样,当他完成工作时,我从filesystemwatcher那里得到错误“在目录C:\”中同时出现太多更改错误。现在如果它是c:\很明显有很多变化。但在这种特殊情况下,我设置了以下参数:
Path = C:\
Filter = "test1.txt"
NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName
IncludeSubdirectories = true
我启动了观察者,让它在没有问题的情况下运行了4个小时,之后Í锁定了电脑,不久之后又回来了,突然发现了错误。
现在我想知道在这种情况下可能导致错误的原因。我忽略了重要的事情吗?或者,它可以是includesubdirectories参数让它检查c:\的所有子目录并忽略C:\中存在的单个文件的过滤器。
答案 0 :(得分:1)
你可以增加缓冲区的变化 - 这对我有一次帮助。
但是要在C:\中查找每个更改,可能会导致很多工作量。
MSDN FileSystemWatcher.InternalBufferSize Property
修改强>
过滤器仅在Raising-Method中进行检查 - 因此内部每个变化都会被类识别。
我看了一下框架代码 你可以看到主要的提升方法.....
private void NotifyFileSystemEventArgs(int action, string name)
{
if (this.MatchPattern(name))
{
switch (action)
{
case 1:
this.OnCreated(new FileSystemEventArgs(WatcherChangeTypes.Created, this.directory, name));
return;
case 2:
this.OnDeleted(new FileSystemEventArgs(WatcherChangeTypes.Deleted, this.directory, name));
return;
case 3:
this.OnChanged(new FileSystemEventArgs(WatcherChangeTypes.Changed, this.directory, name));
return;
}
}
}
正在使用这种方法:" this.MatchPattern(name)" - 看起来像这样:
private bool MatchPattern(string relativePath)
{
string fileName = System.IO.Path.GetFileName(relativePath);
return ((fileName != null) && PatternMatcher.StrictMatchPattern(this.filter.ToUpper(CultureInfo.InvariantCulture), fileName.ToUpper(CultureInfo.InvariantCulture)));
}
并且正如您所看到的 - 过滤器在此处进行检查 - 很晚才能抑制负载...... ...所以唯一的办法就是增加缓冲区大小!