2015-08-18 2 views
-2

Я создал программу для просмотра файла блокнота с помощью filewatcher .. всякий раз, когда текст в файле изменяется. Я создал программу .exe для запуска ... .exe-программу также работает нормально .. Но он работает дважды ... Я искал Stackoverflow и другие веб-сайты .. но я не мог понять, где я поступил не так. Frnds Plz помогите мне в очищении моей ошибки .. Я знаю, что этот вопрос задавался много раз .. Но так как им новое для этого в C# я не мог понять .. Plz помочь мне frnds ..Процесс запускается дважды в событии OnChanged

public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void filewatcher() 
    { 
     path = txtBoxPath.Text; 
     FileSystemWatcher fileSystemWatcher1 = new FileSystemWatcher(); 
     fileSystemWatcher1.Path = path; 
     fileSystemWatcher1.Filter = "*.txt"; 
     fileSystemWatcher1.NotifyFilter = NotifyFilters.LastWrite; 
     fileSystemWatcher1.Changed += new FileSystemEventHandler(OnChanged); 
     fileSystemWatcher1.EnableRaisingEvents = true; 
    } 

    private void tbtextcopy() 
    { 
     Clipboard.SetText(File.ReadAllText(path)); 
     this.textBox1.Text = Clipboard.GetText().ToString(); 
    } 
    private void OnChanged(object sender, FileSystemEventArgs e) 
    { 

     try 
     { 
      ProcessStartInfo PSI = new ProcessStartInfo(@"C:\Program Files\Ranjhasoft\Icon Changer\Icon changer.exe"); 
      Process P = Process.Start(PSI); 
      P.WaitForExit(); 
      P.Close(); 
     } 

     finally 
     { 
      fileSystemWatcher1.EnableRaisingEvents = false; 
     } 

    } 

    private void BrowserBtn_Click(object sender, EventArgs e) 
    { 

     FolderBrowserDialog dlg = new FolderBrowserDialog(); 
     dlg.SelectedPath = this.txtBoxPath.Text; 
     DialogResult result = dlg.ShowDialog(); 

     if (result == DialogResult.OK) 
     { 
      if (!string.IsNullOrEmpty(dlg.SelectedPath)) 
      { 
       this.txtBoxPath.Text = dlg.SelectedPath; 
      } 
     } 

     if (string.IsNullOrEmpty(this.txtBoxPath.Text)) 
     { 
      this.txtBoxPath.Text = appDataFolder; 
     } 
     if (!Directory.Exists(path)) 
     { 
      MessageBox.Show("Specified folder does not exist"); 
     } 
    } 

    private void txtBoxPath_TextChanged(object sender, EventArgs e) 
    { 
     if (!string.IsNullOrEmpty(this.txtBoxPath.Text)) 
     { 
      this.filewatcher(); 
     } 
    } 

} 

}

+1

возможно дубликат [FileSystemWatcher Changed события повышались дважды] (http://stackoverflow.com/questions/1764809/filesystemwatcher-changed-event-is-raised-twice) – sstan

+0

так @sstan я должен использовать этот fileSystemWatcher1.EnableRaisingEvents = true; в команде try вместо filewatcher() – Kopika

+0

Я тоже прочитал эту статью. Я хочу знать, где «я» пошло не так ... – Kopika

ответ

2

у вас есть код

fileSystemWatcher1.Changed += new FileSystemEventHandler(OnChanged);

вы можете быть повторно добавлять один и тот же обработчик события к событию .. да так, он может сделать это в 20 раз ..

Вам нужно всего лишь установить его для запуска кода один раз, так что только добавьте его один раз. Если вы прекратите стрельбу, обработчик события не уничтожит. Поэтому установите обработчик событий один раз, а не каждый раз в свой файл-метод, который будет повторно добавлять один и тот же обработчик и производить несколько ответов.

Так изменить код здесь:

public Form1() 
{ 
    InitializeComponent(); 
    fileSystemWatcher1.Changed += new FileSystemEventHandler(OnChanged); 
} 

и удалить его из метода FileWatcher. Теперь он будет запускаться один раз, когда значение raiseevents будет установлено true, и совсем не будет, когда оно не будет.

+0

thank u @BugFinder Как мне заставить его запускать один раз ..? Plz объясняет это ясно. извините заранее, если я не тупой. – Kopika

+0

Позвольте мне отредактировать мой ответ – BugFinder

+0

Пока я могу редактировать ваш код, он не помог бы, так как кто-то другой, читающий ваш вопрос, остался бы удивленным, если бы вы были о .. .. видя, что вопрос и ответ больше смысла. – BugFinder

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