0

如果创建了任何文件,我有一个FileSystemWatcher检查多个目录。

            ((System.ComponentModel.ISupportInitialize)(FileMonitor)).BeginInit();
            FileMonitor.EnableRaisingEvents = true;
            FileMonitor.Created += new FileSystemEventHandler(FileMonitor_Created);
            FileMonitor.Path = Path.ToString();
            FileMonitor.IncludeSubdirectories = true;
            FileMonitor.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Attributes;
            ((System.ComponentModel.ISupportInitialize)(FileMonitor)).EndInit();

由于某种原因,FileMonitor_Created 事件在运行应用程序时并不总是被触发,即使它应该触发。感觉很随意...

但是,如果我在 FileMonitor_Created 方法处设置断点,它会完美运行:如果设置了断点,则该事件每次应该触发。

我尝试为 FileMonitor 设置一个 InterBufferSize,但这没有效果。

更新

我将Changed事件添加到 Filemonitor 并为其提供与Created事件相同的处理程序。它现在以某种方式工作,尽管该文件实际上是创建的,而不是更改的。

我仍然很好奇为什么在设置断点时它总是以“旧方式”工作。

4

5 回答 5

4

你做了多少改变?

Windows 操作系统会通知您的组件有关 FileSystemWatcher 创建的缓冲区中的文件更改。如果短时间内有很多变化,缓冲区可能会溢出。这会导致组件丢失对目录更改的跟踪,并且它只会提供一揽子通知。使用 InternalBufferSize 属性增加缓冲区的大小是昂贵的,因为它来自无法换出到磁盘的非分页内存,因此请保持缓冲区小而大,以免错过任何文件更改事件。要避免缓冲区溢出,请使用 NotifyFilter 和 IncludeSubdirectories 属性,以便您可以过滤掉不需要的更改通知。

取自MSDN

于 2012-10-25T14:42:08.137 回答
0

如果你有一个断点,它的工作,但如果你没有,它不是?

您确定您的事件处理程序中没有任何内容吗?就像发生了一个异常,使程序“感觉”它什么也没做?您可以在处理程序中发布代码吗?

于 2012-10-25T14:40:47.687 回答
0

将您的业务逻辑与 FileMonitor_Created 事件分开。在这种情况下,您应该存储事件参数并返回。例如,将事件参数存储在队列中,然后异步处理这些事件。

于 2012-10-25T14:56:50.163 回答
0

FileMonitor.Created 当文件被创建并且未被替换为具有相同创建日期时间的前一个文件时触发。

场景 1) 在输入文件夹中复制并粘贴相同的 abc.txt 文件,而不更改文件创建日期或文件内容 - 文件观察程序无法识别该文件。

场景 2) 复制粘贴并在输入文件夹中使用新创建的日期复制相同的文件 文件观察器识别该文件

所以创建的事件适用于第二种情况,它可能不是你的情况,但在我的第一个视图中看起来是隐藏的行为。

于 2012-11-06T07:31:17.350 回答
0

引发事件时,文件处理可能需要一些时间。在此期间,可能会创建另一个文件,并且事件处理程序不会处理第二个文件,因为它仍在处理第一个文件。因此,第二个文件被FileSystemWatcher.

解决方案是将文件检测和文件处理分成两个线程,然后通过队列连接。它是生产者-消费者队列。

文件检测应该尽可能短。它应该只检测一个文件,将其文件名排入队列,文件处理线程可以处理并关闭,以便可以检测到另一个文件。文件处理线程可以使文件名出列并花费尽可能多的时间来处理它。

我用本文中的代码详细解释了这一点:FileSystemWatcher skips some events

于 2015-10-09T23:58:19.160 回答