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

我想看更改网络服务器上的文件夹树。 这些文件都具有特定的扩展。 有树约200文件夹和带我看的延长约1200文件。

我不能写一个服务,在服务器上运行(禁地!),所以解决方案必须是本地的客户端。 及时性不是特别重要。 我可以在通知一分钟或更长的延迟住。 我看的创建,删除,重命名和更改。

将使用.NET System.IO.fileSystemWatcher创建许多服务器上的负载?

怎么样10个独立的观察家们砍来的文件夹/文件的数量被监视? (下降到200从700的文件夹,从1200 5500文件中总)多个网络业务,而不是少? 我的想法是服务器把文件看了下1棵树上一次洗牌。 我可能不总是有这个选项,因此观察家的团队。

我想其他的解决办法是定期检查,如果FSW在服务器上创建一个过度的负荷,或者如果它不一大堆的系统管理员类型的原因工作。

有一个更好的方法吗?

Answer 1:

从一个服务器负载点,使用IO.FileSystemWatcher为您所描述的情况下远程更改通知,就很有可能是最有效的方法。 它使用FindFirstChangeNotification和ReadDirectoryChangesW内部Win32 API函数,进而以最优化的方式(假设标准的Windows网络与网络重定向通信:如果使用第三方重定向器,它不支持所需要的功能,赢得的东西“T在所有的工作)。 在.NET包装还采用了异步I / O和一切,进一步确保最高效率。

这种解决方案的唯一问题是,它不是很可靠。 除了不必处理网络连接暂时消失(这不是一个太大的问题,因为IO.FileSystemWatcher会在这种情况下,你可以处理触发一个错误事件),其作用机制具有一定的基本限制。 从MSDN文档的Win32 API函数:

ReadDirectoryChangesW失败ERROR_INVALID_PARAMETER当缓冲长度是大于64 KB,并且应用程序在网络上监视的目录。 这是由于数据包大小限制与下面的文件共享协议

打电话时,通知可能不会返回FindFirstChangeNotification的远程文件系统

换句话说:在高负载下(当你需要一个大的缓冲区),或者更糟的是,在随机不确定的情况下,你可能不会得到你所期望的通知。 这甚至与本地文件系统观察家的一个问题,但它更在网络上的问题。 这里SO另一个问题详细说明,在更详细一点的API的固有可靠性问题。

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

如果你正在寻找的文件有序列号,存储你有告知了最后一个序列号,所以你可以看看未来的通知“差距”和处理你没有得到通知的该文件;

在接收到通知,总是做一个完整的目录扫描。 这可能听起来很糟糕,但由于扫描是事件驱动的,它仍然比哑轮询高效得多。 另外,只要你保持文件在一个目录总数,以及目录的数量进行扫描,在千元左右,这种操作对性能的影响应该是相当小反正。

设置多个听众是你应该避免尽可能多的:如果有的话,这会让事情变得可靠......

用于/修改每一个文件创建1通知:无论如何,如果你绝对使用文件系统观察家,事情只要你意识到的限制,而不要指望1工作确定。

所以,如果你有其他选择(本质上,具有工艺书面文件通知您在非基于文件系统的方法:任何规则RPC方法将改进...),这些都是绝对值得寻找到从可靠性角度观点。

Answer 2:

我使用C#中的文件系统观察家多次。 我第一次用他们,我与他们停止工作,这主要是由于这样的事实,我正在处理该报告的改变线程的变化问题。

但是现在,我只是推变化到一个队列并处理在另一个线程队列中。 这似乎解决了我本来的问题。 对于你的问题,你可以有多个观察家推到相同的队列。

但是,我还没有跟你这类问题的规模用这个。

Answer 3:

根据我的经验,一个FSW不会产生高网络流量。 但是,如果有性能问题,你用几个观察家并将其分解到较少的文件夹被监视的方法听起来很合理。

我有一些大的问题,FSW网络驱动器上,但:删除文件总是抛出的错误事件,永远不会被删除的事件。 我没有找到一个解决办法,所以我现在尽量避免使用FSW是否有办法解决它?

Answer 4:

在MSDN文档指出 ,你可以使用FileSystemWatcher组件来监视网络驱动器上的文件系统的变化。

这也表明,观察者组件侦听文件系统更改通知,而不是周期性地询问更改目标驱动器。

基于网络流量的数量完全取决于你希望有多少该网络驱动器的内容发生变化。 该FSW组件将不会增加网络流量的水平。

Answer 5:

守望者看起来100%可靠的 - 只是看监控器对象上的缓冲区大小。 我测试过数以千计的文件更新中,没有丢失。

我建议使用多线程的方式 - 将触发作为文件守望者。 它可以启动一个线程检测到每个文件的变化。 观察器可以与溢出的机会较少更快的处理。 (使用异步线程)

Answer 6:

使用System.IO.FileSystemWatcher了一段时间后。 这是不够稳定的处理是在太快了即将发生的事件。 为了确保100%的读取文件。 我用简单的方法目录通过文件进行搜索。 看完后,立即将文件复制到另一个文件夹。 要当你正在阅读的文件添加新的文件隔离。

定时器用于定期读取的文件夹。 通过复制已经读取文件存档文件夹,这确保它不会被再次读取。 后续读取将永远新文件。

VAR文件名= Directory.GetFiles(srcFolder); 的foreach(在文件名中的字符串文件名){串[]行= File.ReadAllLines(文件名);

Answer 7:

我不认为有任何种类的计算机与FSW,其位置被监视的计算机之间的活动状态或通信。 换句话说,在FSW不查验网络操作系统,以检查该文件。

人们会想象,一个消息或事件, 引发/在发生变化时发送到网络FSW。

但这一切都只是猜测。 :)

文章来源: System.IO.FileSystemWatcher to monitor a network-server folder - Performance considerations

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值