我想要看一个文件夹树上的一个网络服务器的变化。该文件有一个特定的扩展。大约有200个文件夹在树和大约1200文件的扩展,我看。

我不能写一服务在服务器上运行(禁!) 这样的解决方案已经被当地的客户。及时性并不是特别重要的。我可以忍受一分钟或更长延迟通知。我看,用于创建,删除,重新命名和改变。

会使用的.网系统。IO.更改建多个服务器的负载?

如何大约10个独立的观察家削减数量的文件夹/文件正在看着?(降至200从700个文件夹,从1200 5500的文件在总)更多的网络通信量而不是更少?我的想法是一个改组的服务器上把看到文件在1树。我不能总有这个选项,因此团队的观察者。

我想其他的解决方案是一个定期检查,如果赛福斯特造成不必要的负载服务器,或者如果它不工作了整整一堆系统管理员类型的原因。

有没有更好的方式做到这一点?

有帮助吗?

解决方案

从一个服务器的负载的观点,使用 IO.更改 对于遥远的变化中的通知的情况描述可能是最有效的方法可能的。它使用 FindFirstChangeNotificationReadDirectoryChangesW Win32API功能在内部,而这又与该网络通信器在一种优化方式(假设的标准Windows网络:如果一第三方器被使用,并且它不支持所需的功能,事情不会在所有的工作).。净的包装也使用异步I/O和一切,进一步确保最高的效率。

唯一的问题与这个方案是,它不是很可靠的。比其他具有处理与网络连接的走暂时(这是不是太多的问题,因为IO.更改将火错误的事件,在这种情况下,你可以处理),根本机构具有某些基本的限制。从MSDN文件Win32API职能:

  • ReadDirectoryChangesW 失败与ERROR_INVALID_PARAMETER当缓冲区的长度大于64KB和应用程序是监测的一个目录的网络。这是由于一个分组的大小限制的基础文件共享协议

  • 通知可能不会返回时叫 FindFirstChangeNotification 对于一个远程文件系统

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

当使用文件系统看守人,您的应用程序应该能够处理这些局限性。例如:

  • 如果文件,你在寻找有序列号、储存的最后一个序列号你有得到有关通知的,所以你可以看看"空白"在未来的通知和处理文件并没有得到通知;

  • 在接到通知,始终做一个全面的目录进行扫描。这可能听起来真的很糟糕,但是由于扫描事件驱动的,它仍然是有效得多的比愚蠢的投票。此外,只要你保持的文件总数中的一个目录,以及该数量的目录进行扫描,下一千或因此,影响这种操作上的效能应该是相当小。

设立多的听众是有些东西你应该尽可能避免:如果有的话,这会使事情甚至 可靠的...

无论如何,如果你绝对 使用文件系统观察,事情可以工作好只要你知道的限制,并不指望1:1的通知每个文件的修改/创建的。

所以,如果你有其他的选择(从本质上讲,具有过程中编写的文件通知您一个非文件系统基础的办法:任何正规的RPC方法将是一个进步...),这些都是值得肯定找的到来自可靠性的观点。

其他提示

我多次使用C#的文件系统观察者。我第一次使用它们时,我遇到了停止工作的问题,主要是因为我正在处理报告更改的线程中的更改。

然而,现在,我只是将更改推送到队列并在另一个线程上处理队列。这似乎解决了我原来的问题。对于您的问题,您可以让多个观察者进入同一队列。

但是,我没有用你的问题来解决这个问题。

根据我的经验,FSW不会产生高网络流量。但是,如果存在性能问题,您使用多个观察者并将其分解为更少的正在观看的文件夹的方法听起来是合理的。

我在网络驱动器上遇到了FSW的一些大问题:删除文件总是抛出错误事件,而不是删除事件。我没有找到解决方案,所以我现在避免使用FSW,如果有办法解决它......

MSDN文档显示您可以使用FileSystemWatcher组件来监视网络驱动器上的文件系统更改。

它还表示观察程序组件侦听文件系统更改通知,而不是定期询问目标驱动器是否有更改。

基于此,网络流量的数量完全取决于您希望该网络驱动器的内容发生变化的程度。 FSW组件不会增加网络流量。

Watcher看起来100%可靠 - 只需观察观察者对象上的缓冲区大小。 我已经测试了数千个文件更新,没有丢失。

我建议使用多线程方法 - 触发器是文件监视器。 它可以为检测到的每个文件更改启动一个线程。观察者可以更快地处理 溢出的可能性较小。 (使用异步线程)

使用System.IO.FileSystemWatcher一段时间之后。它不够稳定,无法处理过快发生的事件。确保100%读取文件。我使用简单的目录方法来搜索文件。阅读后,立即将文件复制到另一个文件夹。将其与正在读取文件时添加的新文件隔离开来。

定时器用于定期读取文件夹。通过将已读取的文件复制到存档文件夹,可确保不会再次读取该文件。随后的读取将始终是新文件。

var fileNames = Directory.GetFiles(srcFolder);
foreach (string fileName in fileNames)
{
   string[] lines = File.ReadAllLines(fileName);
}

我不认为计算机与FSW和正在监视其位置的计算机之间存在任何类型的活动状态或通信。换句话说,FSW没有ping网络操作系统来检查文件。

可以想象,当发生更改时,消息或事件仅 引发/发送到联网的FSW。

但这只是猜测。 :)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top