さまざまなフォルダにさまざまなファイルが存在するかどうかを監視するサービスについて書いています...ファイルシステムウォッチャーを使用してイベントを取得しています。
展開の一環として、監視対象フォルダーの1つが削除され、新しいフォルダーが作成されることがあります。
その結果、サービスはエラーをスローして停止します...
そのようなエラーをキャッチして、サービスによって新しいフォルダにファイルウォッチャーを再作成することは可能ですか?
さまざまなフォルダにさまざまなファイルが存在するかどうかを監視するサービスについて書いています...ファイルシステムウォッチャーを使用してイベントを取得しています。
展開の一環として、監視対象フォルダーの1つが削除され、新しいフォルダーが作成されることがあります。
その結果、サービスはエラーをスローして停止します...
そのようなエラーをキャッチして、サービスによって新しいフォルダにファイルウォッチャーを再作成することは可能ですか?
これは、.deletedイベントで処理できます。ただし、filesystemwatcher.Pathに割り当てられているディレクトリを削除すると、エラーが発生する場合があります。これを回避する1つの方法は、監視対象ディレクトリの親をfilesystemwatcher.Pathに割り当てることです。次に、.deletedイベントで削除をキャッチする必要があります。
削除したばかりのディレクトリにアクセスしようとすると、ハンドラー内でエラーが発生する可能性もあります。これが発生すると、通常のブレークポイントが得られない可能性があり、削除自体が原因のようです。
削除されたイベントをキャッチし、新しいイベントを監視するために時間指定のポーリングでスケジュールを変更しますか?
現在、渡すコンパイラはありませんが、この擬似コードをノックアップしました。
using System;
using System.IO;
public class Watcher : IDisposable{
void Dispose(){ watcher.OnDeleted -= onDelete; }
string file;
FileSystemWatcher watcher;
FileSystemEventHandler onDelete;
public class Watch(string file, FileSystemEventHandler onDelete) {
this.file = file;
watcher = new FileSystemWatcher{ Path = file }
this.OnDelete = onDelete;
watcher.Deleted += onDelete;
watcher.NotifyFilter = ...; // looking for delete event;
// Begin watching.
watcher.EnableRaisingEvents = true;
}
}
public static class watch {
Watcher watcher;
public static void Main() {
watcher = new Watcher("somedir", ondeleted);
SetUpChangeWatchers();
while(true){
// stuff!
}
CleanUpChangeWatchers();
}
private static void ondeleted(object source, RenamedEventArgs e){
CleanUpChangeWatchers();
watcher.Dispose();
while(!directoryRecreated(file)){
Thread.Sleep(...some delay..);
}
SetUpChangeWatchers();
watcher = new Watcher("somedir", ondeleted);
}
}