为什么这个C#代码产生两次输出

时间:2014-01-13 15:19:00

标签: c# visual-studio-2010

您好我是C#的新手,正在测试一个简单的openFileDialog程序。我目前编写的代码似乎正在完成它的工作,但输出产生了两次。任何帮助将不胜感激。

我的代码:

        watcher.Changed += new FileSystemEventHandler(OnChanged);
        watcher.Created += new FileSystemEventHandler(OnChanged);
        watcher.Deleted += new FileSystemEventHandler(OnChanged);

        watcher.EnableRaisingEvents = true;
    }

    private void OnChanged(object source, FileSystemEventArgs e)
    {

        MessageBox.Show("copying done");

        StreamReader inStream = new StreamReader(destFile);
        string line;
        string[] lineSplit;
        bool errorFound = false;

        while ((line = inStream.ReadLine()) != null)
        {   
            lineSplit = line.Split(' ');
            for (int i = 0; i < lineSplit.Length; i++)
            {
                if (lineSplit[i] == textBox2.Text)
                {
                    errorFound = true;
                    MessageBox.Show("Error found in " + e.Name);
                    MessageBox.Show("Exiting");
                    break;
                }

            }
        }
        inStream.Close();

    }

输出:

    Copying Done
    File: ..Changed
    Copying Done
    File: ..Changed

只是想知道为什么会打印两次?

4 个答案:

答案 0 :(得分:5)

因为它会在OnChangedwatcher.Created

上同时调用watcher.Changed

答案 1 :(得分:4)

您已多次附加到同一个处理程序:

watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnChanged);
watcher.Deleted += new FileSystemEventHandler(OnChanged);

例如,如果ChangedCreated事件运行,您将获得两次相同的输出。

您可能想要做的是为每个事件创建单独的方法。我不知道watcher是什么,但这是一个大致的想法:

watcher.Changed += new FileSystemEventHandler(OnChanged);
watcher.Created += new FileSystemEventHandler(OnCreated);
watcher.Deleted += new FileSystemEventHandler(OnDeleted);

private void OnCreated(object source, FileSystemEventArgs e)
{
    // do something when the watcher is created
}

private void OnDeleted(object source, FileSystemEventArgs e)
{
    // do something when the watcher is deleted
}

答案 2 :(得分:1)

您需要记住的是,单个IO操作可以触发多个不同的FileSystemWatcher事件。

  

通用文件系统操作可能会引发多个事件。例如,当文件从一个目录移动到另一个目录时,可能会引发一些OnChanged和一些OnCreated和OnDeleted事件。

MSDN

最有可能的是,这里发生的是文件创建正在触发Create事件和Change事件(我相信windows倾向于创建一个初始文件(触发创建)然后写入它(触发更改)) 。但是,这完全取决于您正在执行的操作。

答案 3 :(得分:0)

这就是我修复它的方法,不知道它是不是最好的方法,但它有效!

private static void OnChanged(object source, FileSystemEventArgs e)
{
        //set EnableRaisingEvents = false at the start of the method.
        FileSystemWatcher t = source as FileSystemWatcher;
        t.EnableRaisingEvents = false;
        //do stuff that you want in the method, in my case checking for words.  
        .... 
        ....
        //Set EnableRaisintEvents true again
        t.EnableRaisingEvents = true;

}

这个小小的修复确保每次更改只会引发一次事件,而不是两次。