テキスト ファイルを検索するアプリケーションがあり、ファイルに何らかの変更があった場合は、OnChanged
イベント ハンドラを使用してイベントを処理します。 を使用していますNotifyFilters.LastWriteTime
が、それでもイベントが 2 回発生します。コードは次のとおりです。
public void Initialize()
{
FileSystemWatcher _fileWatcher = new FileSystemWatcher();
_fileWatcher.Path = "C:\\Folder";
_fileWatcher.NotifyFilter = NotifyFilters.LastWrite;
_fileWatcher.Filter = "Version.txt";
_fileWatcher.Changed += new FileSystemEventHandler(OnChanged);
_fileWatcher.EnableRaisingEvents = true;
}
private void OnChanged(object source, FileSystemEventArgs e)
{
.......
}
私の場合OnChanged
、テキスト ファイルを変更しversion.txt
て保存すると、 が 2 回呼び出されます。
ベストアンサー1
残念ながら、これはこのFileSystemWatcher
クラスのよく知られたバグ/機能です。これはこのクラスのドキュメントからの抜粋です:
特定の状況では、1 つの作成イベントによって、コンポーネントによって処理される複数の Created イベントが生成されることにお気付きになる場合があります。たとえば、FileSystemWatcher コンポーネントを使用してディレクトリ内の新しいファイルの作成を監視し、メモ帳を使用してファイルを作成してテストすると、作成されたファイルが 1 つだけであるにもかかわらず、2 つの Created イベントが生成される可能性があります。これは、メモ帳が書き込みプロセス中に複数のファイル システム アクションを実行するためです。メモ帳は、ファイルの内容を作成し、次にファイル属性を作成するバッチでディスクに書き込みます。他のアプリケーションも同様に実行される場合があります。FileSystemWatcher はオペレーティング システムのアクティビティを監視するため、これらのアプリケーションによって発生するすべてのイベントが取得されます。
このテキストはCreated
イベントに関するものですが、他のファイル イベントにも同じことが当てはまります。一部のアプリケーションでは、プロパティを使用してこれを回避できる場合がありますNotifyFilter
が、私の経験では、手動で重複フィルタリング (ハック) を行う必要がある場合もあります。
少し前にいくつかのページをブックマークしましたFileSystemWatcher のヒント(アーカイブ済み)。ぜひチェックしてみてください。