System.IO.FileSystemWatcher 监视网络服务器文件夹 - 性能注意事项

2024-04-09

我想查看网络服务器上的文件夹树的更改。这些文件都有特定的扩展名。树中大约有 200 个文件夹和大约 1200 个带有我正在查看的扩展名的文件。

我无法编写在服务器上运行的服务(禁止!),因此解决方案必须位于客户端本地。及时性并不是特别重要。我可以忍受通知延迟一分钟或更长时间。我正在监视创建、删除、重命名和更改。

使用 .NET System.IO.fileSystemWatcher 会给服务器带来很大的负载吗?

10 个独立的观察者来减少正在观察的文件夹/文件的数量怎么样? (从 700 个文件夹减少到 200 个,总共从 5500 个文件减少到 1200 个)网络流量增加而不是减少?我的想法是对服务器进行重新洗牌,将观看的文件放在一棵树下。我可能并不总是有这个选择,因此有观察者团队。

我认为另一个解决方案是定期检查 FSW 是否在服务器上创建了过度的负载,或者是否由于一大堆 SysAdmin 类型的原因而无法工作。

有一个更好的方法吗?


从服务器负载的角度来看,使用IO.文件系统观察者 https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher对于您描述的场景中的远程更改通知可能是最有效的方法。它使用查找第一个更改通知 http://msdn.microsoft.com/en-us/library/aa364417.aspx and 读取目录更改W http://msdn.microsoft.com/en-us/library/aa365465.aspxWin32 API 函数在内部,进而以优化的方式与网络重定向器进行通信(假设标准 Windows 网络:如果使用第三方重定向器,并且它不支持所需的功能,则根本无法工作) 。 .NET 包装器还使用异步 I/O 等,进一步确保最高效率。

该解决方案的唯一问题是它不太可靠。除了必须处理暂时消失的网络连接(这并不是什么大问题,因为在这种情况下 IO.FileSystemWatcher 会触发一个您可以处理的错误事件),底层机制具有某些基本限制。来自 Win32 API 函数的 MSDN 文档:

  • 读取目录更改W https://learn.microsoft.com/en-us/windows/desktop/api/winbase/nf-winbase-readdirectorychangesw当缓冲区长度大于 64 KB 并且应用程序正在通过网络监视目录时,会失败并显示 ERROR_INVALID_PARAMETER。这是由于底层文件共享协议的数据包大小限制造成的

  • 调用时可能无法返回通知查找第一个更改通知 https://learn.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-findfirstchangenotificationw对于远程文件系统

换句话说:在高负载下(当您需要大缓冲区时),或者更糟糕的是,在随机的未指定情况下,您可能无法收到您期望的通知。这甚至是本地文件系统观察程序的问题,但更多的是网络上的问题。关于SO的另一个问题 https://stackoverflow.com/questions/57254/更详细地描述了 API 固有的可靠性问题。

使用文件系统观察程序时,您的应用程序应该能够处理这些限制。例如:

  • 如果您要查找的文件有序列号,请存储您收到通知的最后一个序列号,以便您可以在未来的通知中查找“间隙”并处理您未收到通知的文件;

  • 收到通知后,请始终进行完整目录扫描。这听起来可能很糟糕,但由于扫描是事件驱动的,它仍然比哑轮询高效得多。此外,只要将单个目录中的文件总数以及要扫描的目录数量保持在一千左右,无论如何,此操作对性能的影响应该很小。

设置多个侦听器是您应该尽可能避免的事情:如果有的话,这将使事情变得更加不可靠......

无论如何,如果您绝对必须使用文件系统观察程序,只要您意识到这些限制,事情就可以正常工作,并且不要期望每个修改/创建的文件都会收到一对一的通知。

因此,如果您有其他选择(本质上,让写入文件的进程以基于非文件系统的方式通知您:任何常规 RPC 方法都将是一种改进......),从可靠性角度来看,这些绝对值得研究看法。

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

System.IO.FileSystemWatcher 监视网络服务器文件夹 - 性能注意事项 的相关文章

  • 如何捕获一个 int

    我正在使用 IL 抛出一个 Int32 并捕获它 这只是出于好奇 我并没有试图实现任何目标 所以请不要告诉我抛出异常而不是 int method private hidebysig static void Main string args
  • 使用 XML 的 WCF 请求验证

    我有一个WCF使用 Net 4 0框架的SOAP Web服务 我在用contract first方法 即 服务代码是使用 WCSF Blue 工具从手写 WSDL 生成的 我对请求消息有以下要求 如果价格小于 100 则不得有税项 但如果大
  • 跨平台 C++ 文件系统观察器

    我正在寻找一个跨平台文件系统观察器 类似于文件系统观察者 http msdn microsoft com en us library system io filesystemwatcher aspx NET 中的类 因为它是守护进程 服务
  • WPF 如何从 DataTemplate 访问控件

    我有一个包含网格的数据模板 网格内有一个组合框
  • 如何判断应用程序是否是Web应用程序

    在 Windows 服务和 Web 应用程序中运行的核心程序集中 我需要存储每个用户会话的信息 该服务将具有单个用户会话 并且 Web 应用程序使用 HttpContext Current 我想配置在核心程序集中使用哪种方法 约定优于配置
  • 合并两个(或更多)PDF

    背景 我需要为我的销售人员提供每周报告包 该包包含几个 5 10 个水晶报告 Problem 我想允许用户运行所有报告并且只运行单个报告 我想我可以通过创建报告然后执行以下操作来做到这一点 List
  • R 数据结构的运算效率

    我想知道是否有任何关于操作效率的文档R 特别是那些与数据操作相关的 例如 我认为向数据框添加列是有效的 因为我猜您只是向链接列表添加一个元素 我想添加行会更慢 因为向量保存在数组中C level你必须分配一个新的长度数组n 1并将所有元素复
  • 基于xsd模式生成xml(使用.NET)

    我想根据我的 xsd 架构 cap xsd 生成 xml 文件 我找到了这篇文章并按照说明进行操作 使用 XSD 文件生成 XML 文件 https stackoverflow com questions 6530424 generatin
  • .NET 字符串.替换

    我很生气 通常 我喜欢像 C 中那样进行替换 但是是否有一种 C 风格的替换 它一次仅替换一个字母或我指定的 X 数量 不 BCL 中不存在仅替换字符的单个实例的 Replace 方法 两个主要的 Replace 方法将替换所有出现的情况
  • 如何将 .NET 控制台应用程序转换为 Winforms 或 WPF 应用程序

    我经常从一个简单的控制台应用程序开始尝试一个想法 然后创建一个新的基于 GUI 的项目并将代码复制进去 有更好的方法吗 我可以轻松转换现有的控制台应用程序吗 只需添加一个新的Winform 将以下代码添加到您的Main Applicatio
  • 如何从进程开始捕获所有应用程序/窗口消息? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我试图弄清楚如何捕获进程 窗口的所有窗口消息 从它在 c 中启动时开始 该过程不是我自己的 所以我需要使用某种钩子 我的目标是开始实时
  • 比较两个 numpy 数组的最快方法

    我有两个数组 gt gt gt import numpy as np gt gt gt a np array 2 1 3 3 3 gt gt gt b np array 1 2 3 3 3 无论顺序如何 比较这两个数组的元素是否相等的最快方
  • 为什么微软在 .net 3.5 SP1 之前就废弃了 JavaScriptSerializer,而在 .net 3.5 SP1 之后又重新启用了 JavaScriptSerializer?

    JavaScriptSerializer 在 net 3 5 SP1 之后并没有过时 我应该使用 JavaScriptSerializer 还是之前推荐的 DataContractJsonSerializer 还有为什么它被淘汰了 我很乐意
  • Laravel 上传前如何压缩图像?

    我正在制作一个图片库网站 用户可以在其中上传任何图像 它们将显示在前端 我需要在不影响图像质量的情况下压缩图像 以减小图像大小 以便页面加载速度不会影响那么大 我使用以下代码来上传图像 rules array file gt require
  • Android Drawable 绘图性能?

    在我看来 我有一个简单的 ARGB 可绘制对象 大约需要 2 毫秒才能绘制 但我可以在 0 5 毫秒内绘制与位图相同的文件 只是一些快速代码 我真的不能认为它是一个选项 优化可绘制对象的绘制速度的最佳方法是什么 这取决于可绘制的数量以及每个
  • jQuery 选择器:为什么 $("#id").find("p") 比 $("#id p") 更快

    该页面的作者 http 24ways org 2011 your jquery now with less suck http 24ways org 2011 your jquery now with less suck断言 jQuery
  • C# 中的 C/C++ 代码编译器

    在 C 中 我可以使用下面的代码编译 VB 和 C 代码 但无法编译 C C 代码 有什么办法可以做到这一点吗 C 编译器 public void Compile string ToCompile string Result null st
  • 在 Windows CE 6.0 与 Windows Mobile 6.1 下进行开发的权衡是什么

    我有一个 Windows NET 应用程序 我计划将其 移植 并定制为移动设备 该应用程序由一个独立的 NET 程序组成 该程序与条形码扫描仪配合使用 具有简单的 UI 并将扫描结果记录到文件中 还有一个 Windows 服务 可以使用 W
  • rabbitmq 的 REST API

    有没有办法从 ajax 向 RabbitMQ 发送数据 我的应用程序由数千个 Web 客户端 用 js 编写 和 WCF REST 服务组成 现在我试图弄清楚如何为我的应用程序创建可扩展点 这个想法是有一个rabbitmq实例 它从放置在一
  • 如何对单个 TypoSript 对象生成进行基准测试?

    我想对单个 TypoScript 对象生成进行基准测试以控制性能 是否可以使用某些 stdWrap 方法 我想要对其进行基准测试的 TS 对象示例 Test 1 page 10 RECORDS page 10 tables pages so

随机推荐

  • 队列管理和新线程

    在 Net 4 0 框架上使用 C 我有一个 Windows 窗体主线程 迄今为止唯一的一个 等待文件系统事件 然后必须对这些事件提供的文件启动一些预定义的处理 我计划执行以下操作 A1 当主进程启动时立即创建一个单独的线程 A2 让主线程
  • python中按特定顺序读取文件

    假设我的文件夹中有三个文件 file9 txt file10 txt 和 file11 txt 我想按这个特定顺序读取它们 谁能帮我这个 现在我正在使用代码 import glob os for infile in glob glob os
  • 无法获取 OLEObject 类的 Object 属性 - Excel Interop

    我用谷歌搜索了这个问题 但未能找到解决方案 如果文件保存为 xls 而不是 xlsm 则此代码有效 我使用的是 Office 2013 32 位 我编写了一个 COM 公开的 C 类库 Excel工作簿实例化一个对象并传入对当前工作簿的引用
  • 使用airflow的DataflowPythonOperator安排数据流作业时出错

    我正在尝试使用airflow 的DataflowPythonOperator 来安排数据流作业 这是我的 dag 运算符 test DataFlowPythonOperator task id my task py file path my
  • 如何从 Azure Key Vault 中的证书获取私钥?

    我在 Azure Key Vault 中有一个证书 我想从中提取私钥 根据微软文档 https learn microsoft com en us azure key vault certificates about certificate
  • Delphi 在保存对话框中覆盖现有文件

    我正在使用 TSaveDialog 组件通过单击按钮来保存文件 但是 我在保存现有文件名时遇到问题 通常 当您想要在 Windows 中保存现有文件时 会弹出一个消息框 询问您是否确实要覆盖该文件 TSaveDialog 组件的情况并非如此
  • 想要在 dojo 中创建一个组合框,其中下拉菜单和自动完成功能仅在用户输入 4 个字符后才启动

    我想在 dojo 中创建一个组合框 其中下拉菜单和自动完成功能仅在用户输入 3 个字符后才会启动 当前的默认设置将开始显示下拉菜单 并在用户输入第一个字符时自动完成 是否有任何属性可以实现此行为 我可以重载某些函数吗 或者我应该自己编写一个
  • GlassFish 3 + Maven + 远程部署

    我找不到任何关于如何通过 Maven 将简单的基于 Maven 的项目部署到远程 GlassFish 服务器的明确答案 mvn package xxx deploy 我认为只有 Cargo 插件支持 GlassFish 3 对吧 我在配置方
  • 为什么在 git reset (--mixed) 之前显式调用 git reset --soft

    在 git 文档 以及许多 SO 线程 中 建议使用这种重置方法 git reset soft HEAD go back to WIP state lt 2 gt git reset lt 3 gt 2 这将从提交历史记录中删除 WIP 提
  • UTF-8 格式的 JAVA Http POST 请求

    我的 J2EE 应用程序能够从 JSP 页面接收 POST 请求 这没有问题 但是如果我使用另一个java应用程序发送POST请求 收到的参数不是UTF 8字符串 这是我的代码 URL url new URL http localhost
  • 使用 std:fstream 如何拒绝对文件的访问(读和写)

    如何拒绝访问使用 fstream 打开的文件 我想在使用 fstream 读取 写入文件时无法访问该文件 您无法使用标准 fstream 来做到这一点 您必须使用特定于平台的函数 在 Windows 上 您可以使用创建文件 http msd
  • 创建 Android 锁屏应用程序。

    如何创建一个锁屏应用程序作为 Android 手机的锁 我确实找到了一个 但它的代码构造很差 如果我按下物理主页键 它就会解锁 使应用程序毫无意义 我确实遇到过一个论坛 指出 Android 4 x 中删除了一些阻止 home 按钮功能的方
  • Google 日历 API - 设计用于?

    我想使用 FullCalendar Javascript 实现 Google Calendar API 在开始编码之前 我有一些问题需要了解 Google Calendar API 的主要用途 如您所知 在创建和启用 API 之前有一些身份
  • 如何在nextjs中添加字体ttf文件

    我是 Nextjs 的新手 我想将自定义字体添加到我的项目中 我完全不知道如何做到这一点 我的字体位于 public fonts 中 我的 global css 文件是这样的 html body padding 0 margin 0 fon
  • 如何在jquery中向FormData添加变量?

    实际上我正在使用以下脚本来发布我的表单 var formData new FormData form driver information 0 ajax type POST url data formData success functio
  • C 中的三重指针:这是风格问题吗?

    我觉得 C 中的三重指针被视为 坏 对我来说 有时使用它们是有意义的 从基础开始 单指针有两个目的 创建数组 并允许函数更改其内容 通过引用传递 char a a malloc or void foo char c means I m go
  • 我如何解密签名并添加到目标 c 中的 YouTube 提取 URL?

    我正在尝试在我的应用程序中播放 YouTube 视频 一切正常 但是当我尝试观看包含 YouTube 内容的视频时 它失败 我研究发现有人认为你应该加密和解密签名并将其添加到 URL 中 我不知道该怎么做decrypt signature
  • 在多个文件上循环一个函数

    我写了一个简单的函数 myfunction lt function fileName stringsAsFactors TRUE check names FALSE skip 1 Data lt read delim fileName sk
  • 更新 Microsoft Dynamics 365 CRM 中的多个记录的 Soap 请求

    我们试图在 CRM 中一次更新多个记录 但基于 wsdl 没有直接的方法可以做到这一点 一种方法是通过传递要更新的记录的 CRM ID 来更新 CRM 中的每条记录 然而 通过阅读文档 我们发现有一种方法可以运行 ExecuteMultip
  • System.IO.FileSystemWatcher 监视网络服务器文件夹 - 性能注意事项

    我想查看网络服务器上的文件夹树的更改 这些文件都有特定的扩展名 树中大约有 200 个文件夹和大约 1200 个带有我正在查看的扩展名的文件 我无法编写在服务器上运行的服务 禁止 因此解决方案必须位于客户端本地 及时性并不是特别重要 我可以