これは、これを実装する際のベストプラクティスについての質問です。
FileSystemWatcher
ファイルとフォルダに対するユーザーの変更について通知する必要があるがあります。サブディレクトリも監視されます。同じディレクトリで、私のプログラムも時々変更されます。FileSystemWatcher
これらのプログラム変更のイベントを検出したくありません。
私の最初の実装は、予想されるイベントを追加できるリストでした。ファイルシステムイベントを取得したら、リストを確認し、存在する場合は無視します。これはあまり堅牢に聞こえませんが、機能しているようです。
今、私は本当の問題を検出しました:
D:はによって監視されていFileSystemWatcher
ます。
次のような2つのフォルダーがあります。D:\ folder1 \ folder2
ここで、アプリケーションでfolder1(folder2を含む)を削除します。そこで、削除リストにD:\folder1を追加しました。それから私はのようなものを呼びますDirectory.Delete(@"D:\folder1", true)
。今、私はfolder1が例外を超えて(なぜ)削除できないことに気づきました。リストから削除エントリを削除しましたが、folder2はすでに削除されており、彼のFileSystemEventを取得しています。したがって、D:\ folder1\folder2のFileSystemイベントを取得します。私のプログラムは、ユーザーがこのフォルダーを削除し、間違ったことをしていると考えています。
私は今いくつかのアイデアを持っていました:
1.)すべてのファイルとすべてのフォルダを独自に削除して、フォルダを再帰的に削除します。これで、すべてのサブフォルダーを取得し、独自のリストエントリを提出します。私はすでにそれを実装しましたが、それは非常に非常に遅いです。
FileSystemWatcher
2.)私のリストを時代遅れにするために賢いフィルターを入れるより良い方法があるかもしれませんか?
3.)すべてを削除できる場合にのみ、ディレクトリツリーを削除できる可能性があります。したがって、失敗した場合でもすべてがあり、そうでない場合はすべてが削除されます。これは私にとって最もエレガントな解決策のようですが、これが可能かどうかさえわかりませんか?
4.)私のソフトウェアですべてのファイルとフォルダを排他的にロックすることは可能ですか?これで問題がなければ、1つの削除コマンドですべてを削除できるはずです。
私は他の追加の解決策も受け入れています。
1を編集して、より明確にします。
フォルダに対するユーザーアクションのみを「表示」したい。ここで自分のプログラムから物事を操作する場合、このイベントを見たくありません。
私の実装では、フォルダーがロックされていて削除できない場合、サブフォルダーのイベントを取得します。
私は英語を母国語としないので、英語で説明するのはそれほど簡単ではありません;)。
編集2:
FileSystemWatcher
5.)定義されたプロセスからのすべてのイベントをフィルタリングすることは可能ですか?