InternalBuffer在.net FileWatcher中的作用是什么

时间:2010-02-02 08:50:33

标签: c# .net filesystemwatcher

通过做一些谷歌,我开始知道'它用于跟踪文件系统操作'。但是我并没有理解它的实用性,观察者可以直接触发事件而不将其存储在某个中间缓冲区中!!

是否可以将异步事件流(复制/修改文件)转换为同步事件调用?另外,我不确定FileWatcher是否异步触发事件。

有人可以对此有所了解吗?

4 个答案:

答案 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用于跟踪文件系统中的更改。它监视目录并将以下更改报告给目录中的任何文件:

  • OnCreated:在创建文件或目录时调用
  • OnChanged:更改文件或目录时调用
  • OnRenamed:在重命名文件或目录时调用
  • OnDeleted:删除文件或目录时调用

“内部缓冲区”是操作系统向FileSystemWatcher发送信息的方式。它的大小由“InternalBufferSize”属性控制。

如果一次发生太多变化,内部缓冲区就会填满。然后,您不会获得所有单独的更改,而是获得单个更改通知:

  • OnError:由于缓冲区溢出导致个别更改丢失时调用

FileSystemWatcher以异步方式触发事件。具体而言,只要文件发生更改,就会触发事件。