2014-01-13 74 views
2

嗨我对C#来说还是个新手,并且正在测试一个简单的openFileDialog程序。我目前编写的代码似乎在做它的工作,但是,输出产生了两次。任何帮助,将不胜感激。为什么这个C#代码产生两次输出

我的代码:

 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 

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

+0

可能与[此问题](http://stackoverflow.com/questions/1764809/filesystemwatcher-changed-event-is-raised-twice) – stuartd

回答

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; 

} 

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

5

因为它调用OnChanged上都watcher.Createdwatcher.Changed

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 
} 
1

你需要记住什么,是一个IO动作可以触发多个不同的FileSystemWatcher事件。

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

MSDN

最有可能的,这里发生了什么是一个文件的创建同时触发一个创建事件,变化事件(我相信窗口,往往会造成一个初始文件(触发创建),然后写(引发变化))。但是,这取决于您正在执行的操作。

相关问题