我有FileSystemWatcher
我想为复制到监视目录中的每个文件夹1>} 。将手动将多个文件夹一次性复制到此监视目录中。
目前只会为复制的第一个文件夹触发OnCreated event
因此,如果我正在观看文件夹X并在Windows资源管理器中选择文件夹A,B,C并将它们复制到X,则会为A而不是B或C触发event
。
这是我用来设置OnCreated
:
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
任何想法为什么这只会触发复制到监视目录的第一个文件夹的事件?
答案 0 :(得分:10)
Windows操作系统会在FileSystemWatcher创建的缓冲区中通知组件文件更改。 如果短时间内有很多变化,缓冲区可能会溢出。这会导致组件无法跟踪目录中的更改,并且只会提供一揽子通知。使用InternalBufferSize属性增加缓冲区的大小是昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请保持缓冲区尽小但足够大,以免错过任何文件更改事件。 要避免缓冲区溢出,请使用NotifyFilter和IncludeSubdirectories属性,以便过滤掉不需要的更改通知。
这似乎是一个内部限制。
我认为一次粘贴所有三个文件夹的行为被认为是“短时间内的许多变化” - 您可以使用NotifyFilter并省略一些事件吗?