4

我有一个FileSystemWatcher我想OnCreated event 为复制到监视目录中的每个文件夹触发一个。将手动将多个文件夹一次复制到此监视目录中。

目前它只为event复制的第一个文件夹触发。
因此,如果我正在查看文件夹 X 并在 Windows 资源管理器中选择文件夹 A、B、C 并将它们复制到 X 中,OnCreated则会为 A 而不是 B 或 C 触发。

这是我用来设置的代码FileSystemWatcher

watcher = new System.IO.FileSystemWatcher(watchPath);            
watcher.InternalBufferSize = 32768;
watcher.IncludeSubdirectories = true;
watcher.NotifyFilter = NotifyFilters.FileName | NotifyFilters.DirectoryName | 
                       NotifyFilters.CreationTime | NotifyFilters.LastWrite;


watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnCreated);
watcher.EnableRaisingEvents = true;

这是我的OnCeated方法

void OnCeated(object sender, FileSystemEventArgs e)
{            
    XDocument xmlDoc = BeginImport(e.FullPath); 
}

知道为什么这只会触发复制到监视目录中的第一个文件夹的事件吗?

4

1 回答 1

10

文档中

Windows 操作系统会通知您的组件在由 FileSystemWatcher 创建的缓冲区中的文件更改。如果短时间内有很多变化,缓冲区可能会溢出。这会导致组件失去对目录更改的跟踪,并且它只会提供一揽子通知。使用 InternalBufferSize 属性增加缓冲区的大小是昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请保持缓冲区小而大,以免错过任何文件更改事件。为避免缓冲区溢出,请使用 NotifyFilter 和 IncludeSubdirectories 属性,以便您可以过滤掉不需要的更改通知。

这似乎是一个内部限制。

我相信一次粘贴所有三个文件夹的行为被认为是“在短时间内进行了很多更改”——你可以使用NotifyFilter并省略一些事件吗?

于 2012-09-18T18:29:02.720 回答