2011-01-31 7 views
5

ディレクトリ内の変更を確実に検索する方法を探しています。.NET Frameworkを使用してディレクトリ内のファイルの変更を確実に監視する方法

私はFileSystemWatcherを使用しようとしましたが、多くの小さなファイルが作成、変更、または削除されたときはむしろ不正確です。私のテストでは、ファイルの約1〜2%が失われています。何千ものファイルをすばやく追加または変更しているときは、それはかなり大変です。

私はさまざまな間隔で500ミリ秒、2000ミリ秒などでポーリングを試みました。この場合、私はあまりにも多くのヒットを取得します。それはFileInfoオブジェクトのタイムスタンプの解決と関係しているかもしれません。

私の質問です。 .NET Frameworkを使用してディレクトリへの変更を確実に取得することは可能でしょうか?

- クリスチャン

答えて

7

InternalBufferSizeを増やしてみましたか? どのサイズに設定しましたか? MSDNから

:バッファサイズが を超えた場合FileSystemWatcherは イベントを見逃す可能性があること


注意。イベントの欠落を避けるには、 のガイドラインに従います。 InternalBufferSizeプロパティを設定して、 のバッファサイズを増やします。長いファイル名を持つファイルを見ると、 は、 という長いファイル名がバッファをいっぱいにするため、 を避けてください。 の名前を変更して、これらのファイルの名前をより短い の名前に変更します。


はできるだけ短くしてイベント処理コードを保管してください。

+0

ありがとう、これは今私の問題を解決するようです。それは64 KBのバッファを持つファイルを見逃すことはできません、最適な設定を見つけるためにいくつかのテストを実行する必要があります。 –

4

はい、適切なモニタリングは、ファイルシステムフィルタドライバを使用して実行されます。そのようなドライバは、(ファイルシステムに到達する前または後に)ファイルシステムに送信されるすべての要求を傍受します。このようにして、すべての通知を時間内(またはイベントが発生する前)に取得し、要求の受け渡しと要求と一緒に渡される情報を制御できます。

このようなフィルタドライバを自分で書くことができます(実際に実装するには6〜9ヶ月の作業時間が必要です)。または、CallbackFilter製品を使用してカーネルモードの開発を避けることができます。 CallbackFilterは、.NET、VCL、およびネイティブC++用に事前構築されたドライバとAPIを提供します。

+1

提案していただきありがとうございます。私は実際に廃止されたプロジェクトを調査する前にCallbackFilterを見てきました。これは趣味のプロジェクトなので、今私はそれを簡単に保つ必要があります。しかし、あなたを念頭に置いてください;) –

+3

@Eugene:この回答は、数人のユーザーによってスパムとしてフラグが立てられています。私はそれが確信されていません、あなたの製品のように見える(その分野の専門家ではないにもかかわらず)実際に*問題の解決策を提供しています。しかし、将来的には自社製品を宣伝していることをもう少し明白にすることを検討したいかもしれません。おそらく底面などの免責事項。そして+1はダウンボントに対抗する。 –

+1

@Cody Grey - 「私たちの...製品」というフレーズは、ユーザー名とともに、私にとってはかなり明確に言います。これは前に説明されています(Metaで議論され、ここでテストされています)。 –

関連する問題