0

作成されたファイルがFileSystemWatcherある場合、複数のディレクトリをチェックするがあります。

            ((System.ComponentModel.ISupportInitialize)(FileMonitor)).BeginInit();
            FileMonitor.EnableRaisingEvents = true;
            FileMonitor.Created += new FileSystemEventHandler(FileMonitor_Created);
            FileMonitor.Path = Path.ToString();
            FileMonitor.IncludeSubdirectories = true;
            FileMonitor.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Attributes;
            ((System.ComponentModel.ISupportInitialize)(FileMonitor)).EndInit();

何らかの理由で、FileMonitor_Createdイベントは、アプリケーションの実行時に発生する必要がある場合でも、常に発生するとは限りません。ランダムに感じます...

ただし、FileMonitor_Createdメソッドにブレークポイントを設定すると、完全に機能します。ブレークポイントが設定されている場合、イベントは必要なときに毎回発生します。

FileMonitorにInterBufferSizeを設定しようとしましたが、効果がありませんでした。

アップデート

ChangedイベントをFilemonitorに追加し、イベントと同じハンドラーを指定しましたCreated。ファイルは実際に作成され、変更されていませんが、どういうわけか今は機能しています。

ブレークポイントを設定するときに、なぜそれが常に「古い方法」で機能したのか、私はまだ興味があります。

4

5 に答える 5

4

どのくらいの変更を行っていますか?

Windows オペレーティング システムは、FileSystemWatcher によって作成されたバッファー内のファイルの変更をコンポーネントに通知します。短時間に多くの変更がある場合、バッファがオーバーフローする可能性があります。これにより、コンポーネントはディレクトリ内の変更を追跡できなくなり、一括通知のみが提供されます。InternalBufferSize プロパティを使用してバッファーのサイズを大きくすると、ディスクにスワップ アウトできない非ページ メモリに由来するため、負荷が高くなります。そのため、ファイル変更イベントを見逃さないように、バッファーをできるだけ小さく保ちます。バッファ オーバーフローを回避するには、NotifyFilter プロパティと IncludeSubdirectories プロパティを使用して、不要な変更通知を除外できるようにします。

MSDNから取得

于 2012-10-25T14:42:08.137 に答える
0

FileMonitor.Createdは、ファイルが作成され、同じ作成日時の前のファイルに置き換えられなかった場合に発生します。

シナリオ1)ファイルの作成日やファイルの内容を変更せずに、入力フォルダー内の同じabc.txtファイルをコピーして貼り付けます---ファイルウォッチャーはファイルを認識しません。

シナリオ2)コピーして貼り付け、入力フォルダー内の同じファイルを新しく作成された日付で右に貼り付けますファイルウォッチャーがファイルを認識します

したがって、作成されたイベントは2番目のシナリオで機能します。これはあなたの状況ではないかもしれませんが、私の最初のビューでは隠された動作に見えます。

于 2012-11-06T07:31:17.350 に答える
0

ビジネス ロジックを FileMonitor_Created イベントから分離します。イベントでは、イベント パラメータを保存して を返す必要があります。たとえば、イベント パラメータをキューに格納し、これらのイベントを非同期に処理します。

于 2012-10-25T14:56:50.163 に答える
0

イベントが発生すると、ファイルの処理に時間がかかる場合があります。その間、別のファイルが作成される可能性があり、イベント ハンドラーはまだ最初のファイルを処理しているため、2 番目のファイルを処理しません。したがって、2 番目のファイルは によって失われFileSystemWatcherます。

解決策は、ファイル検出フォームのファイル処理を 2 つのスレッドに分割し、キューで接続することです。これは生産者と消費者のキューです。

ファイルの検出は、できる限り短くする必要があります。ファイルを検出し、ファイル処理スレッドが処理できるキューにそのファイル名をエンキューして閉じ、別のファイルを検出できるようにするだけです。ファイル処理スレッドは、ファイル名をデキューし、その処理に必要なだけ時間がかかることがあります。

この記事のコードでこれを詳しく説明しました: FileSystemWatcher はいくつかのイベントをスキップします

于 2015-10-09T23:58:19.160 に答える
0

ブレークポイントがある場合は機能しますが、そうでない場合はそうではありませんか?

イベント ハンドラーに何かが含まれていないことを確認しますか? 何もしていないようにプログラムを「感じさせる」例外が発生しているように?ハンドラーにコードを投稿できますか?

于 2012-10-25T14:40:47.687 に答える