FileSystemWatcher获取的事件太多了

时间:2012-02-22 14:25:03

标签: c# filesystemwatcher

我正在尝试实现一个文件监视器,如果文件内容发生了变化,它将引发一个事件。 一旦我正在观看的文件被修改的问题,我得到2个事件。 (我想只得到一次)

_automationStatusWatcher = new FileSystemWatcher(fileInfo.Directory.FullName,
                                                 fileInfo.Name);
_automationStatusWatcher.NotifyFilter = NotifyFilters.LastWrite;
_automationStatusWatcher.Changed += OnAutomationStatusChanged;
_automationStatusWatcher.EnableRaisingEvents = true;

我正在观看的文件无意重新创建/移动/删除/无论如何。它的目的是成为一个xml数据库文件,我需要在它更改后监视它。我希望在修改文件时只获得1个事件,并忽略其他事件。

我该怎么做?

6 个答案:

答案 0 :(得分:2)

Manual

  

注意

     

通用文件系统操作可能会引发多个事件。例如,当文件从一个目录移动到另一个目录时,可能会引发几个OnChanged和一些OnCreated和OnDeleted事件。移动文件是一项复杂的操作,由多个简单操作组成,因此可以引发多个事件。同样,某些应用程序(例如,防病毒软件)可能会导致FileSystemWatcher检测到其他文件系统事件。

答案 1 :(得分:2)

前段时间我不得不应对这个问题。我希望在创建文件时收到通知。问题是当文件仍为空或仍在写入时触发事件,而不是在新文件关闭时触发。

解决方案是使用临时名称创建文件,并在完成后将文件重命名为其最终名称。然后我看了重命名事件。

您可以在写入文件时将文件命名为myfile.tmp,并在完成后将其重命名为myfile.xml并观看重命名事件。

答案 2 :(得分:1)

您可以尝试在捕获更改后取消挂钩事件处理程序,直到您准备好接受更多更改:

_automationStatusWatcher.Changed -= OnAutomationStatusChanged;

但这不一定是线程安全的,无论如何你都可以获得多次射击。 另一个选择是使用信号量变量来查看您是否正在处理更改:

private bool _inStatusChange = false;
private void OnAutomationStatusChanged(object sender, args...)
{
    if (_inStatusChange)
    {
        return;
    }
    else
    {
         _inStatusChange = true;
        //do work
        _inStatusChange = false;

    }
}

您应该使用适当的锁定来保持对信号量变量线程安全的访问。

答案 3 :(得分:1)

我也遇到了这个问题,现在我发现了这个问题:

new Thread(() => {
            while (true) {
                var r = watch.WaitForChanged(WatcherChangeTypes.All);
                this.Invoke(new ThreadStart(() => {
                    listBox1.Items.Add(string.Format("{0} {1} {2}", DateTime.Now, r.Name, r.ChangeType));
                }));
            }
        }) { IsBackground = true }.Start();

与java中的nio非常相似

答案 4 :(得分:0)

如果查看FileSystemWatcher的文档,它会说它会多次触发。

Moving a file is a complex operation that consists of multiple simple operations, therefore raising multiple events. Likewise, some applications (for example, antivirus software) might cause additional file system events that are detected by FileSystemWatcher.

我建议您使用某种排队机制,这样就不会对同一个文件进行多项操作。

答案 5 :(得分:0)

我在检查日志配置的更新方面遇到了类似的问题 我读到了FileSystemWatcher的多事件问题。所以我决定实施另一个解决方案。

如果通过比较修改日期更改了配置文件,我会检查每次访问。后来我添加了一个延迟(2秒)以避免对文件系统的过多访问。也许你也可以这样使用。