FileSystemWatcher 和 Windows 7

2023-11-22

我正在编写一个监视网络目录的工具,该工具在 Windows Server 2008 计算机上运行,​​任何不使用 Windows 7 的计算机都可以从放置在网络驱动器上的文件正确触发 FileSystemWatcher 的 OnChanged 事件,对于某些计算机如果在 Windows 7 计算机上(一次)复制的文件数量超过 19 个,则不会触发任何事件,尽管如果文件是单独完成的,它会起作用。是否有解决方法,或者这就是 Windows 7 内核处理 FSW 事件的方式?

只是为了澄清一下,当从 XP 计算机复制时,它适用于数千个文件。 (该软件仍在2008年的服务器机器上)。


From MSDN:

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

如果增加缓冲区大小还不够,并且您无法控制一次触发事件的文件数量,则必须添加额外的轮询。

另请参阅此相关问题:

当许多文件同时添加到目录中时,FileSystemWatcher 无法正常工作...

Update:

简单地增加缓冲区大小可能很诱人,但应谨慎执行。事实上,网络访问是有64k限制的。这FileSystemWatcher类正在使用 Windows API 函数ReadDirectoryChangesW下面有这个限制:

当缓冲区长度大于 64 KB 并且应用程序正在通过网络监视目录时,ReadDirectoryChangesW 将失败并显示 ERROR_INVALID_PARAMETER。这是由于底层文件共享协议的数据包大小限制。

如果您想更深入地了解修改缓冲区大小的成本,您应该查看 Microsoft 的 Walter Wang 的帖子:

网络上的 FileSystemWatcher(全文引用如下)

很抱歉,该文档 FileSystemWatcher.InternalBufferSize 没有说得很清楚 监控网络时的缓冲区大小 小路。建议不要超过64K 监视网络路径时。

FileSystemWatcher 基本上是一个 .Net Win32 的包装器 ReadDirectoryChangesW API。使用 ReadDirectoryChangesW,您创建并 指定操作系统将使用的缓冲区 填充更改。然而, 中未提及的内容 ReadDirectoryChangesW 文档 (但在 FileSystemWatcher 文档)是 文件系统创建内部内核 用于存储变化信息的缓冲区 暂时,直到有机会 更新用户缓冲区。的大小 创建的内核缓冲区是 与指定的尺寸相同 ReadDirectoryChangesW 并创建 在非分页池内存中。每次 文件系统观察者 / ReadDirectoryChangesW 已创建 / 调用时,还会创建一个新的内核缓冲区 创建的。

内核内存池(分页和 非分页)在系统中预留 设备驱动程序的地址空间和 要使用的其他内核组件。他们 动态增长和收缩 必要的。当前的大小 可以通过以下方式轻松查看泳池 任务的“性能”选项卡 经理。池子将会增长 动态地直到达到最大值 启动时计算的值 并取决于可用的系统 资源(主要是 RAM)。你不 想要达到这个最大值,否则 各种系统服务和驱动程序 将开始失败。然而,这 计算最大值并不容易 可用的。确定最大值 池大小,您需要使用内核 调试器。如果您有兴趣 有关系统的更多信息 内存池,我建议你 看看 MSPress 书中的第 7 章 《Windows 2000 内部》作者:Solomon 和 鲁西诺维奇.

考虑到这一点,就没有 关于缓冲区大小的建议 您可以使用。当前和最大 系统池的大小将是 因客户而异。 然而,你可能不应该去 每个 FileSystemWatcher 超过 64k / ReadDirectoryChangesW 缓冲区。这 源于这样一个事实:有一个 网络访问的 64k 限制为 记录在 ReadDirectoryChangesW 中。 但最终你会得到 在各种上测试应用程序 预期的目标系统,以便您 可以调整你的缓冲区。

存在与 .Net 相关的开销 应用程序,我想 Win32 ReadDirectoryChangesW 程序 或许能够取得更好的成绩 相同缓冲区大小的性能。 然而,由于速度非常快且数量众多 文件更改,缓冲区溢出将会 不可避免,开发商正在走 必须处理案件时 发生超限,例如手动 枚举要检测的目录 变化。

总之,FileSystemWatcher 和 ReadDirectoryChangesW 是 轻量级文件更改检测 机制将有其 限制。更改期刊是 我们将采取的另一种机制 考虑中等重量的解决方案,但是 仍然有局限性:

http://msdn.microsoft.com/en-us/library/aa363798%28VS.85%29.aspx

重量级解决方案是 编写专用的文件系统过滤器 位于文件系统中的驱动程序 堆栈和监视文件系统 变化。当然这将是 最复杂的方法。大多数病毒 扫描仪、备份软件和文件 系统监控实用程序,例如 filemon (www.sysinternals.com) 实现过滤器驱动程序。

我希望以上解释对您有所帮助 了解问题的根本原因 你正在经历。请回复 让我们知道您是否需要 更多信息。谢谢。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FileSystemWatcher 和 Windows 7 的相关文章

  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 为什么 int8_t 和用户通过 cin 输入显示奇怪的结果[重复]

    这个问题在这里已经有答案了 一小段代码让我发疯 但希望你能阻止我跳出窗外 看这里 include
  • 使用的端口未显示在 netstat -a 结果中

    最近当我尝试启动 active mq 默认情况下在端口 61616 上启动 时 这个问题开始出现 但突然间 该端口上不再出现 JVM BIND 问题 即使重新启动计算机后问题也没有消失 主要问题是 Windows 7 上的 netstat
  • 如何让 Swagger 插件在自托管服务堆栈中工作

    我已经用 github 上提供的示例重新提出了这个问题 并为任何想要自己运行代码的人提供了一个下拉框下载链接 Swagger 无法在自托管 ServiceStack 服务上工作 https stackoverflow com questio
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 提交后禁用按钮

    当用户提交付款表单并且发布表单的代码导致 Firefox 中出现重复发布时 我试图禁用按钮 去掉代码就不会出现这个问题 在firefox以外的任何浏览器中也不会出现这个问题 知道如何防止双重帖子吗 System Text StringBui
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 在 LINQ 中按 Id 连接多表和分组

    我想按categoryId显示列表产品的名称组 这是我的代码 我想要我的视图显示结果 Desktop PC HP Red PC Dell Yellow PC Asus Red SmartPhone Lumia 720 Blue 我的组模型
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 具有交替类型的可变参数模板参数包

    我想知道是否可以使用参数包捕获交替参数模式 例如 template
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • 外键与独立关系 - Entity Framework 5 有改进吗?

    我读过了several http www ladislavmrnka com 2011 05 foreign key vs independent associations in ef 4 文章和问题 https stackoverflow
  • 等待进程释放文件

    我如何等待文件空闲以便ss Save 可以用新的覆盖它吗 如果我紧密地运行两次 左右 我会得到一个generic GDI error
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 如何在非控制台应用程序中查看 cout 输出?

    输出到调试窗口似乎相当繁琐 我在哪里可以找到cout如果我正在编写非控制台信息 则输出 Like double i a b cout lt lt b lt lt endl I want to check out whether b is z
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的

随机推荐

  • 使用 PHP 发送 Firebase 通知

    每个人 我在使用 PHP 发送 FIRebase 通知时遇到问题 当我从 Firebase 控制台发送它时 我收到通知 但是当我从 PHP 发送它时 我没有收到任何通知 你知道问题出在哪里吗 这是我的 PHP 代码
  • 谷歌选择器和后端文件下载

    我在我的网络应用程序中使用谷歌选择器来允许用户从他的谷歌驱动器中浏览和选择文件 一旦他做出选择 选择器就会返回有关所选文件的各种数据 包括文件 ID 和 URL 我的目标是将选定的文件下载到服务器 如果我将 URL 传递给后端脚本 它将无法
  • mongodb 在更新中设置 null

    我必须交换文档的值 var query id ObjectId 53e1c254382f891cc600076d db properties find query forEach function prop printjson id pro
  • 使用 cte 创建 while 循环

    如何从 while 循环创建 sql server cte我的循环是这样的 declare ind as int declare code as nvarchar set ind 0 while ind lt 884 begin selec
  • 无法使用 ftplib 列出 FTP 目录 – 但 FTP 客户端可以工作

    我正在尝试连接到 FTP 但无法运行任何命令 ftp server ip ftp username username ftp password password ftp ftplib FTP ftp server ftp login ftp
  • 从批处理文件中重定向输出

    我正在使用一些简单的命令创建一个批处理文件来从系统收集信息 批处理文件包含获取时间 IP 信息 用户等的命令 我将所有命令组装在一个批处理文件中 然后运行 但我希望批处理文件在运行时将结果输出到文本文件 日志 是否有一个命令可以添加到批处理
  • Selenium:尝试获取 Firefox 控制台日志会导致“WebDriverError:不允许 HTTP 方法”

    我试图在我的 selenium 测试中捕获控制台错误 具有 selenium webdriver 4 0 0 alpha 5 和最新的 geckodriver 和 chromedriver 的节点环境 我已经为 Firefox 设置了一个驱
  • 查找每行特定值最近出现的时间

    假设我有一个数据表 dt lt data table datetime seq as POSIXct 2016 01 01 00 00 00 as POSIXct 2016 01 01 10 00 00 by 1 hour ObType c
  • Codeigniter CSRF 令牌问题

    我制作了一个简单的注册 新闻通讯网站 但我遇到了一个奇怪的问题 有些人会收到这样的错误 操作遇到错误 您所提出的要求是不允许的 我已经尝试过google 发现当CSRF设置为true时人们也遇到同样的问题 然而 并不是每个人都会发生这种情况
  • 表格列的对齐方式

    我正在尝试将表放在表内 这意味着嵌套表 现在它看起来像这样截屏 但我需要从左对齐 因为我在每行中使用相同的计数列 您可以看到我为获得此输出所做的尝试 提前致谢 report table border collapse collapse wi
  • reinterpret_cast 到函数指针

    这是我为实验编写的代码reinterpret cast
  • 如何在横向模式和纵向模式之间使用 2 种不同的背景

    我有一个 Android 应用程序 我想知道是否可以为横向和纵向模式提供 1 个布局 1 个布局 xml 文件 但我想要每种模式都有不同的背景 那可能吗 我需要 2 个 xml 文件指向不同的背景图像吗 或者我可以使用 1 个 xml 文件
  • iPad Safari IOS 5 window.close() 关闭错误的窗口

    我们有一个 iPad 应用程序可以在我们的旧款 iPad 上运行 我们使用以下方式打开外部链接 var x window open url 一天结束时 当用户关闭应用程序的这一部分时 我们会检查它打开的所有窗口 并对每个窗口执行 x clo
  • 计算 Postgres 中最近的工作日

    我需要根据订单请求的交货日期在 postgres 查询中安排一些项目 例如 订单要求在星期一交货 例如 20120319 并且订单需要在前一个工作日 20120316 准备 想到最直接的方法 我愿意添加日期表 我认为必须有一种比使用一长串
  • R 中的 ImageMagick

    我想在 R 中使用 ImageMagick 但 R 不允许我安装它 install packages ImageMagick Installing package into C Users FSFH 2 Documents R win li
  • Raku 在编译时执行哪些类型检查?未来这种情况会改变吗?

    目前 截至 2020 年 8 月 Rakudo 不会在编译时对函数的返回值进行类型检查 也就是说 它不提供函数满足其返回约束的静态保证 具体来说 以下两个函数都编译为 Raku sub get int gt Int bug sub get
  • 如何对 UTF-8 字符串数组进行排序?

    我目前不知道如何在 PHP 中对包含 UTF 8 编码字符串的数组进行排序 该数组来自 LDAP 服务器 因此通过数据库排序 没问题 不是解决方案 以下内容在我的 Windows 开发机器上不起作用 尽管我认为这至少应该是一个可能的解决方案
  • StretchBlt HALFTONE == BILINEAR 是否适用于所有缩放?

    谁能澄清一下 GDI 是否拉伸Blt工作站 Win32 API 的函数执行双线性插值以缩放both24 32 位彩色图像的更大和更小图像 如果没有 是否有 GDI notGDI 函数执行此操作吗 The 设置拉伸Blt模式fn 有一个设置H
  • 使用iOS13无法读取电子护照的NFC芯片

    import UIKit import CoreNFC class ViewController UIViewController NFCTagReaderSessionDelegate var nfcTagReaderSession NF
  • FileSystemWatcher 和 Windows 7

    我正在编写一个监视网络目录的工具 该工具在 Windows Server 2008 计算机上运行 任何不使用 Windows 7 的计算机都可以从放置在网络驱动器上的文件正确触发 FileSystemWatcher 的 OnChanged