有没有一种简单的方法可以在C#中避免或停止两次FileSystemWatcher引发事件?

时间:2012-11-18 07:08:28

标签: c# .net winforms filesystemwatcher

我想知道在C#中如何避免或停止FileSystemWatcher两次举起事件?我有一个解决方案,如果有一个文件夹中新创建的xml文件,将每次都检测到。我使用记事本创建xml文件测试我的应用程序,但是从列表框中显示两次。

如何解决此问题?

这是我的代码:

private void fileSystemWatcher1_Created(object sender, System.IO.FileSystemEventArgs e)
    {
        try
        {
            fileSystemWatcher1.EnableRaisingEvents = false;
            listBox1.Items.Add(e.FullPath);
        }

        finally
        {
            fileSystemWatcher1.EnableRaisingEvents = true;
        }
    }

    private void button1_Click(object sender, EventArgs e)
    {
        DialogResult dialogSelectFolder = folderBrowserDialog1.ShowDialog();
        if (dialogSelectFolder.ToString() == "OK")
        {
            textBox1.Text = folderBrowserDialog1.SelectedPath;
            button2.Enabled = true;
        }
    }

    private void button2_Click(object sender, EventArgs e)
    {
        button1.Enabled = false;
        button2.Enabled = false;
        button3.Enabled = true;
        fileSystemWatcher1.EnableRaisingEvents = true;
        fileSystemWatcher1.Path = textBox1.Text;
        fileSystemWatcher1.Filter = "*.xml";
    }

    private void button3_Click(object sender, EventArgs e)
    {
        button1.Enabled = true;
        button3.Enabled = false;
        textBox1.Text = "";
        fileSystemWatcher1.EnableRaisingEvents = false;
    }
}

1 个答案:

答案 0 :(得分:1)

我本人两次偶然发现了这个问题,并创建了一个类,可以帮助您一次仅获得一个事件。当文件不处于读取模式时(例如,复制文件时),您也可能会得到错误事件。

您必须创建一个队列并在其中存储所有事件,如果时间间隔过去,则引发相应的事件。

不幸的是,这不是一个简单的功能,因此我将提供完整的代码。

 y=[{'id': 1, 'var1': 'a', 'var2': 'left', 'var3': 0.1, 'var4': 1},
    {'id': 2, 'var1': 'a', 'var2': 'right', 'var3': 0.3, 'var4':4},
    {'id': 4, 'var1': 'b', 'var2': 'left', 'var3': 0.4, 'var4':4},
    {'id': 5, 'var1': 'b', 'var2': 'right', 'var3': 0.5, 'var4':7}]

您可以在以下位置找到代码: https://github.com/melenaos/FileSystemSafeWatcher/blob/master/FileSystemSafeWatcher.cs