2012-10-17 47 views
8

なぜFileSystemWatcherは2回起動しますか?それを修正する簡単な方法はありますか?確かに私が更新またはテキストファイルを編集する場合、それは一度発射する必要がありますか?イベントハンドラ(AddHander FSW.Created、のAddressOf FSW_Created)が明示的に指定 であれば、イベントが二回発生します -FileSystemWatcherが2回発生するのはなぜですか?

このリンクここhttp://weblogs.asp.net/ashben/archive/2003/10/14/31773.aspxは二回提起さ

  1. イベントを言います。これは、デフォルトで公開イベント がそれぞれの保護されたメソッド(OnChanged、 OnCreated、OnDeleted、OnRenamed)を自動的に呼び出すためです。この問題を解決するには、単純に 明示的なイベントハンドラ(AddHandler ...)を削除します。

「明示的なイベントハンドラを削除する」とはどういう意味ですか?

Imports System.IO 

Public Class Form2 

    Private Sub FileSystemWatcher1_Changed(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Changed 

     'this fires twice 
     MessageBox.Show("test") 

    End Sub 

    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

     FileSystemWatcher1.Path = "C:\Users\c\Desktop\test\" 
     FileSystemWatcher1.NotifyFilter = NotifyFilters.LastAccess Or NotifyFilters.LastWrite Or NotifyFilters.FileName Or NotifyFilters.DirectoryName Or NotifyFilters.CreationTime 

     FileSystemWatcher1.IncludeSubdirectories = False 
     FileSystemWatcher1.Filter = "text.txt" 

    End Sub 

End Class 
+0

この*予期しない動作が発生したのはいつですか?ファイルを編集、移動、削除、またはファイルを作成するときですか? – Arrow

+1

こんにちは、ファイルが編集されたときです - ありがとう –

+0

可能性のある解決策で質問を更新しました。問題の絞り込みに役立つかもしれません。 – Arrow

答えて

8

更新:

私は2つの解決策を考え出しました。 1つはスレッドを使用し、もう1つはスレッドを使用しません。好きなのを選びな :-)。スレッドなし

Imports System.IO 

Public Class Form1 
    Private Sub FileSystemWatcher1_Changed(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Changed 
     Dim watcher As System.IO.FileSystemWatcher = sender 
     watcher.EnableRaisingEvents = False 

     'Do work here while new events are not being raised. 
     MessageBox.Show("Test") 

     watcher.EnableRaisingEvents = True 'Now we can begin watching for new events. 

    End Sub 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

     FileSystemWatcher1.Path = "C:\Users\c\Desktop\test" 
     FileSystemWatcher1.NotifyFilter = NotifyFilters.LastWrite 
     FileSystemWatcher1.IncludeSubdirectories = False 
     FileSystemWatcher1.Filter = "test.txt" 


    End Sub 

    Private Sub FileSystemWatcher_OnChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 

    End Sub 

End Class 

(スレッドなし)このソリューションで、Falseにwatcher.EnableRaisingEventsを設定します。この時点以降、通常は影響を受けるファイル(変更されたファイル)を処理します。その後、作業完了後、EnableRaisingEventsをTrueに戻します。スレッドで

Imports System.IO 

Public Class Form1 
    Private Sub FileSystemWatcher1_Changed(ByVal sender As System.Object, ByVal e As System.IO.FileSystemEventArgs) Handles FileSystemWatcher1.Changed 
     FileSystemWatcher1.EnableRaisingEvents = False 
     Threading.Thread.Sleep(250) 
     FileSystemWatcher1.EnableRaisingEvents = True 


     MessageBox.Show("test") 


    End Sub 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

     FileSystemWatcher1.Path = "C:\Users\c\Desktop\test" 
     FileSystemWatcher1.NotifyFilter = NotifyFilters.LastWrite 
     FileSystemWatcher1.IncludeSubdirectories = False 
     FileSystemWatcher1.Filter = "test.txt" 


    End Sub 

    Private Sub FileSystemWatcher_OnChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) 

    End Sub 

End Class 

このソリューションは、ビットハックものの、作業を行います。 250msごとに新しい変更/イベントのチェックを無効にし、250msごとに変更を確認する必要がないという前提に基づいて、チェックを再び有効にします。私はあなたのための本当の解決策を得るために考えることができるほとんどすべてを試しましたが、これはその間にうまくいくでしょう。

+1

私はこのタイプのソリューションをWeb上の他のポストでも以前に使用しています。それは私にとってもうまくいった。マイクロソフトは、http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx – JimDel

+0

ありがとうございます。スレッドを使用する必要はありませんが、非常に似ている、より適切で実行可能なソリューションが見つかりました。今更新中です。 – Arrow

+0

ありがとう、最初の手法は私のために働いた。私は、LiveReloadで使用するためのスタイルシートをコンパイルしていた小さなWindowsサービスで 'FileSystemWatcher'を使用していました。複数の変更イベントがブラウザを塞いでいました。しかし、この小さな調整では[FUOC](http://www.bluerobot.com/web/css/fouc.asp/)の問題が修正されました。 ;) – harpo

1

e.ChangeTypeを確認してください。あなたは2つの異なる通知を受け取っていると思います。おそらくLastAccessとLastModified。その場合、それは期待される動作です。

+0

ありがとうございます。しかし、それらを取り出してもそれはまだ2回発生します –

関連する問題