通过做一些谷歌,我开始知道'它用于跟踪文件系统操作'。但是我并没有理解它的实用性,观察者可以直接触发事件而不将其存储在某个中间缓冲区中!!
是否可以将异步事件流(复制/修改文件)转换为同步事件调用?另外,我不确定FileWatcher是否异步触发事件。
有人可以对此有所了解吗?
答案 0 :(得分:2)
我认为你错过了问题中的缓冲点。
来自MSDN, FileSystemWatcher(强调我的):
Windows操作系统会通知您的组件文件 由...创建的缓冲区中的更改 FileSystemWatcher的即可。如果有很多 在短时间内改变缓冲区 可以溢出这导致了 组件失去对变化的追踪 目录,它只会 提供全面通知。
所以它不是它尚未告诉你的事件的缓冲区,它是Windows提供的缓冲区,首先支持通知,而不必轮询。如果Windows在此实例中抛出大量操作,则此缓冲区将溢出,而您(FileSystemWatcher的使用者/用户)将丢失一些通知。
答案 1 :(得分:1)
当filewatcher不能同时处理它们时,它必须缓冲请求,这主要是由你编写的代码引起的,以响应FileSystemwatcher抛出的事件。据我所知,FileSystemWatcher事件并非asynchonosly但你可以在事件中产生线程,以使你的codee处理异步。当然,文件系统可以一次更改多个文件,例如删除所有文件或想到复制粘贴。
我希望这很清楚。
答案 2 :(得分:1)
使FileSystemWatcher正常工作的基础Windows API为ReadDirectoryChangesW()。注意第二个参数lpBuffer。这是与内部缓冲区的一对一匹配,内部缓冲区的大小可以通过InternalBufferSize属性设置。
需要缓冲区,因为Windows无法轻松运行用户代码以响应目录更改。这些更改由相应的文件系统驱动程序检测,它们以内核模式运行。运行用户模式代码需要昂贵的模式切换和线程上下文切换,这对于每个检测到的变化来说都太昂贵了。缓冲区用于收集更改,等待用户模式代码开始运行并清空缓冲区。
FSW有一个记录良好的故障模式,可能有太多的变化无法跟上。您将在托管代码中看到错误事件。增加缓冲区大小可以帮助很多,默认缓冲区相当小,为4096字节。尽管如此,将其设置为任意大并不是一个好主意,内核中也需要缓冲区空间,而这是从内核内存池中获取的。这是一个有限的资源,从池中大量吞噬会影响机器上运行的所有程序。
答案 3 :(得分:0)
是的,FileSystemWatcher用于跟踪文件系统中的更改。它监视目录并将以下更改报告给目录中的任何文件:
“内部缓冲区”是操作系统向FileSystemWatcher发送信息的方式。它的大小由“InternalBufferSize”属性控制。
如果一次发生太多变化,内部缓冲区就会填满。然后,您不会获得所有单独的更改,而是获得单个更改通知:
FileSystemWatcher以异步方式触发事件。具体而言,只要文件发生更改,就会触发事件。