2014-01-13 2 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

Вот как я его исправил, не знаю, был ли это лучший способ, но он работает!

Это небольшое исправление гарантирует, что событие только повышается один раз за смену вместо двух.

5

Поскольку он вызывает OnChanged как на watcher.Created и watcher.Changed

4

Вы подключены к одному обработчику несколько раз:

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

Так что, если Changed и Created события запуска, например, вы будете получить тот же результат дважды.

Что вы, вероятно, хотите сделать, это создать отдельные методы для каждого события. Я не знаю, что 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

Скорее всего, что происходит здесь в том, что создание файлов запуска одновременно Создать событие, и изменение событий (я считаю, окна, как правило, создается исходный файл (запуск создания) записывается к нему (вызвав изменение)). Однако это зависит от того, какие действия вы выполняете.

Смежные вопросы