用于通知的 FileSystemWatcher

AEM*_*iji 5 c# notifications filesystemwatcher

我正在创建一个使用 FileSystemWatcher 的 Windows 应用程序。FileSystemWatcher 观察一些目录的变化。每次将某个文件添加到此目录时,FileSystemWatcher 都必须将有关此文件的信息添加到 XML 文件中。一切正常,但是,例如,当我同时添加 100 个文件时(比如某些应用程序将这些文件添加到目录中),并不是每个文件的信息都出现在这个 xml 文件中。

我想使用队列。并使用它向此集合添加项目。并使用计时器。计时器将从该集合向 XML 添加信息。这是个好主意吗?

谁能建议我该怎么做?


所以我认为我必须创建一个 Windows 应用程序和一个 Windows 服务。WinApp 只会向 EventLog 添加信息,Windows Service 会读取信息 EventLog 并将其写入 XML。我认为这将是最好的方法。我在等待好的建议

sta*_*ica 3

正如 Michael Stum 在他的回答中所写,您可以尝试增加缓冲区大小 ( FileSystemWatcher.InternalBufferSize)。但请注意,您不应将此值设置得太高。另外,恕我直言,这可能只是一个临时修复,看看当您同时向文件夹添加更多文件时会发生什么。

如果增加缓冲区大小没有帮助,我已经阅读了您可以尝试的其他一些操作:

  • 如果您订阅了 的通知事件FileSystemWatcher,请尽量让您的事件处理程序尽可能短;IE。确保执行不会停留太久。如果您必须为每个文件通知执行大量工作,您可以尝试启动一个单独的线程并在那里进行处理;然后,您的事件处理程序可以非常快速地返回调用者(并且文件通知将更快地从缓冲区/队列中删除)。

  • FileSystemWatcher除了某些内容已更改的基本通知之外,请勿使用 提供的任何其他信息。一旦收到任何文件更改通知,请等待一段时间,直到不再有通知到达(即等待 100 个同时文件更改通知中的最后一个通知)。然后手动列出目录的内容并将所需信息传输到 XML。

    这有一个主要缺点:手动检测文件是否已被删除、重命名或创建以及哪些文件已被删除、重命名或创建并不容易。您的程序必须保留最后一个目录列表,可以将其与当前列表进行比较以找出更改的内容。

    这样做的优点是您可以相当确定不会由于某些FileSystemWatcher缓冲区溢出而删除任何更改。