C# FileSystemWatcher跳过创建的事件

C# FileSystemWatcher跳过创建的事件,c#,file-monitoring,C#,File Monitoring,我有一个FileSystemWatcher,它检查多个目录中是否创建了任何文件 ((System.ComponentModel.ISupportInitialize)(FileMonitor)).BeginInit(); FileMonitor.EnableRaisingEvents = true; FileMonitor.Created += new FileSystemEventHandler(FileMonitor_C

我有一个
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_创建的事件,即使它应该触发。感觉很随意

但是,如果我在FileMonitor_创建的方法中放置了一个断点,那么它可以完美地工作:如果设置了断点,则事件应该每次都会触发

我尝试为FileMonitor设置InterBufferSize,但没有效果

更新

我将
Changed
事件添加到Filemonitor中,并为其提供与创建的
事件相同的处理程序。虽然文件实际上是创建的,但它现在可以工作了


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

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


您确定事件处理程序中没有任何内容吗?好像发生了一个异常,使程序“感觉”好像什么都没做?你能在处理程序中发布代码吗?

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


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

您正在进行多少更改

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


摘自

您正在进行多少更改

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


取自

将您的业务逻辑与FileMonitor\u创建的事件分开。 在事件中,您应该存储事件参数并返回。
例如,将事件参数存储在队列中,然后异步处理这些事件。

将业务逻辑与FileMonitor\u创建的事件分开。 在事件中,您应该存储事件参数并返回。
例如,将事件参数存储在队列中,然后异步处理这些事件。

FileMonitor.Created在创建文件时触发,而不是替换为具有相同创建日期和时间的上一个文件

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

场景2)复制粘贴并在输入文件夹中的同一个文件上右上方粘贴新创建的日期文件,watcher会识别该文件


因此,创建的事件适用于第二个场景,可能不是您的情况,但对于我的第一个视图,它看起来是隐藏的行为。

FileMonitor.created在创建文件时激发,而不是替换为具有相同创建日期和时间的前一个文件

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

场景2)复制粘贴并在输入文件夹中的同一个文件上右上方粘贴新创建的日期文件,watcher会识别该文件


因此,创建的事件适用于第二个场景,它可能不是您的情况,但在我的第一个视图中看起来是隐藏的行为。

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

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

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


我在本文中用代码详细解释了这一点:

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

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

文件检测应该尽可能短。它应该只检测一个文件,将其文件名放入文件处理线程可以处理的队列中,然后关闭,以便检测到另一个文件。文件处理线程可以将文件名和