4

.Net FileSystemWatcher を使用してディレクトリを監視する小さなテスト アプリケーションを作成しました。大きな (数 Mb) ファイルをそのディレクトリにコピーすると、次のイベントが一覧表示されます (スクリーンショットを参照してください。最初は Delete イベントを無視します)。

代替テキスト http://robinwilson.homelinux.com/FSW.png

(予想どおり) 作成されたイベントを取得しますが、2 つの変更されたイベント (約 0.7 秒間隔) を取得します。どうしてこれなの?これは、私が開発しようとしているアプリケーションで大きな問題を引き起こす可能性があります-ファイルを2回使用しようとするためです(おそらく、書き込みが完了する前に1回です!)。これを止めるために私にできることはありますか?私が StackOverflow などで読んだことから、ファイルが変更されてから閉じられると、変更されたイベントが 1 つだけ取得されるはずです。なぜ 2 つ取得するのですか?

4

2 に答える 2

11

ドキュメントによると( Events and Buffer Sizesの最初の箇条書きを参照):

一般的なファイル システム操作では、複数のイベントが発生する場合があります。たとえば、あるディレクトリから別のディレクトリにファイルを移動すると、いくつかの OnChanged イベント、いくつかの OnCreated イベント、および OnDeleted イベントが発生する可能性があります。ファイルの移動は、複数の単純な操作で構成される複雑な操作であるため、複数のイベントが発生します。同様に、一部のアプリケーション (ウイルス対策ソフトウェアなど) によって、FileSystemWatcher によって検出される追加のファイル システム イベントが発生する場合があります。

于 2008-10-05T14:37:56.213 に答える
2

通常、コピー プログラムは、ファイル全体を一度にではなく、ブロック単位で実行します。これを回避するためにできることは何もないと思います。これに対処するには、アルゴリズムを採用する必要があります。

他のプログラムがコピーを終了してファイルを閉じたときにのみ、プログラムに付与する必要がある排他的な読み取り権限でファイルを開こうとすることができます。そうしないと、IOException が発生し、次の変更を待つことができます。しかし、これは複数の変更イベントを扱うべきではないという意味ではありません。テキスト ファイルをメモ帳で開いて保存すると、変更イベントが生成されますが、ファイルが常にロックされるわけではありません。

もう 1 つの方法は、一定期間、アクセスされたファイルを収集し、FileSystemWatcher がイベントの生成を停止したときに、すべてのファイルを一度に処理することです。

于 2008-10-05T14:29:32.300 に答える