Filesystemwatcher导致“目录C:\ n中一次出现太多更改错误”

时间:2014-09-23 12:33:33

标签: c# filesystemwatcher

与其他几个人一样,当他完成工作时,我从filesystemwatcher那里得到错误“在目录C:\”中同时出现太多更改错误。现在如果它是c:\很明显有很多变化。但在这种特殊情况下,我设置了以下参数:

Path = C:\
Filter = "test1.txt"
NotifyFilter = NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName
IncludeSubdirectories = true

我启动了观察者,让它在没有问题的情况下运行了4个小时,之后Í锁定了电脑,不久之后又回来了,突然发现了错误。

现在我想知道在这种情况下可能导致错误的原因。我忽略了重要的事情吗?或者,它可以是includesubdirectories参数让它检查c:\的所有子目录并忽略C:\中存在的单个文件的过滤器。

1 个答案:

答案 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)));
    }

并且正如您所看到的 - 过滤器在此处进行检查 - 很晚才能抑制负载...... ...所以唯一的办法就是增加缓冲区大小!