关于大容量系统中文件更改的注意事项

更新:2007 年 11 月

FileSystemWatcher 组件可能会接收到大量的事件,尤其是在被设置为监视一个通信量非常大的目录时,更会如此。这会引起问题,因为 FileSystemWatcher 组件只能以可管理的速率接收事件通知。如果事件传入的速率超过了组件可以接收的速率,过剩的事件就存储在一个缓冲区中,此缓冲区然后被传递给组件。组件将此缓冲区中的每一项翻译成对用户代码引发的事件。此缓冲区会引起问题,因为它会溢出。如果目录中的更改太多,不能全都包含在此缓冲区内,操作系统就会发出一个“地毯式”通知,并且组件将引发异常。

安全说明:

如果一个恶意的程序获得了对 FileSystemWatcher 组件正在监视的目录的访问权限,并进行大量更改,使此组件无法管理这些更改,则可能导致拒绝服务攻击。请采纳此帮助页中的建议,并正确地使用访问控制列表,以降低受到拒绝服务攻击的风险。

为避免此问题,需要做以下事情:首先,根据预期收到的大概事件数,将缓冲区设置为合适的大小。默认情况下,缓冲区的大小被设为 4 KB。一个 4 KB 大的缓冲区可以跟踪一个目录下大约 80 个文件的更改。在缓冲区中,每个事件占用 16 个字节,另加足够的字节存储发生事件的文件的名称,以 Unicode 形式(每字符两个字节)表示。可以利用此信息大概估计所需要的缓冲区大小。

通过在“属性”窗口中设置 InternalBufferSize 属性,重置缓冲区的大小。如果使用的是 Microsoft Windows 2000,应按 4 KB 的增量增加缓冲区的大小,因为这与该操作系统的默认页面大小相对应。对于任何其他操作系统,应按与操作系统的默认页面大小相对应的增量增加缓冲区的大小。

提示:

如果不能确定所使用的操作系统的默认页大小,最安全的方法就是在缓冲区原始大小的基础上再增加一倍。这将保持操作系统所需的原始间隔。

除了设置适当的缓冲区大小外,还可以使用以下三个属性控制缓冲区收到的信息量:

  • 使用 NotifyFilter 属性确定 FileSystemWatcher 组件在被监视的目录中查找所有更改,还是仅查找指定的更改。

  • 使用 IncludeSubdirectories 属性指示是否要包括所监视目录的子目录。如果在不需要时关闭此功能,则收到的事件将比打开它时少。

  • 如果已将 FileSystemWatcher 组件设置为监视 Changed 事件,可以使用 NotifyFilter 属性仅指定您关注的事件。

    说明:

    虽然也可以使用 Filter 属性指定要监视的文件或子目录,但该属性是在更改已添加到缓冲区之后才应用的,因此根本不能减小缓冲区的大小。请改用 NotifyFilter 属性来控制写入缓冲区的信息量。

请参见

任务

如何:配置 FileSystemWatcher 组件实例

概念

关于监视文件系统事件的介绍