新しいファイルをチェックし、その内容をデータベースに保存してファイルを削除するようにFileSystemWatcherを設定しました。約10日前に、いくつかのファイルを無視し始めました。私たちは合計で50,000ファイルから約1,500ファイルを話しています。手動で別のディレクトリにファイルを移動し、監視されたディレクトリにそれらを再度移動することによって、ファイルが通知されます。FileSystemWatcherが動作しない場合があります
InternalBufferSizeは、大きなバッチを処理するために32 kBに設定されています。それは問題なく一度に300以上のファイルを処理し、現実はそれにも近くない。
プログラムは、FileSystemWatcherとは無関係の変更のために、40日以上前に最後に触れられました。今は1年以上も生産されています。サーバーの負荷にスパイクは見られません。
突然このような問題が発生する原因は何ですか? FileSystemWatcherが単にunreliableである可能性はありますか?
1000個のファイルが作成されたテストを作成しました。それを実行した後、イベントログに3000件のエントリが見つかります。だから私はバッファオーバーフローが問題外であると思う?複数の方法でプログラムをテストし、何度も何度もコードをチェック
private void button1_Click(object sender, EventArgs e)
{
fsw = new FileSystemWatcher();
fsw.Path = @"C:\temp\fsw-test";
fsw.IncludeSubdirectories = false;
fsw.NotifyFilter = NotifyFilters.FileName;
fsw.Created += new FileSystemEventHandler(fsw_Created_handler);
fsw.EnableRaisingEvents = true;
fsw.InternalBufferSize = 32768;
fsw.Error += fsw_Error_handler;
}
private void fsw_Created_handler(object sender, FileSystemEventArgs e)
{
new Thread(new ParameterizedThreadStart(work)).Start(e);
}
private void fsw_Error_handler(object sender, ErrorEventArgs e)
{
EventLog.WriteEntry("few test", e.GetException().Message);
}
private void work(object e)
{
try
{
EventLog.WriteEntry("fsw test", "Queueing File Started");
Thread.Sleep(10000);
EventLog.WriteEntry("fsw test", ((FileSystemEventArgs)e).Name);
EventLog.WriteEntry("fsw test", "Queueing File Done");
}
catch (Exception ex)
{
EventLog.WriteEntry("fsw test", "Error = " + ex.StackTrace + " *** " + ex.ToString());
}
}
private void button2_Click(object sender, EventArgs e)
{
for (int i = 1; i <= 1000; i++)
{
System.IO.File.Create(@"C:\temp\fsw-test\" + i);
}
}
編集2 ストレスは全く問題がないことを明らかにしました。だから今は再現不可能なバグです、私はそれをより頻繁にログに記録し、状況を監視するためにいくつかの変更を行います。
私が与えることができる唯一のアドバイスは、 'FileSystemWatcher'のオプションのいくつかはかなりわかりにくいということです。私が使ったとき、私は読書/執筆/編集を捕まえると思ったものを設定しましたが、それはすべてを捕まえていませんでした。おそらく、ファイルがどのように「作成」されているかについての新しい「事例」が出現し、FSWがそれらをキャッチするように設定されていないかもしれませんが、働く – Origin
@Originすべてのファイルは全く同じ方法でシステムに入ります。 – Stijn
ウォッチャーから 'Error'イベントを監視していますか? – adrianm