1

NotifyFilters.FileName および NotifyFilters.DirectoryName フィルターを使用して、ファイル/ディレクトリの作成/削除イベントを監視するために FileSystemWatcher を使用しているアプリケーションを開発しています。また、IncludeSubdirectories を true に設定しました

これを使用して、Windows エクスプローラーでフォルダーをコピーすると、その新しいフォルダーのすべてのサブアイテムと新しいフォルダー自体の作成イベントが取得されます。ただし、Windows エクスプローラーで (サブ項目を含む) フォルダーを削除し、Windows エクスプローラーでその操作を「元に戻す」と、サブ項目ではなく、フォルダーの作成イベントのみが取得されます。

サブアイテムがその時点で存在しない可能性があるため、単純に Directory.GetFiles() を実行することはできません。また、ファイルの数/サイズによっては、元に戻す操作に時間がかかる場合があるため、後でディスパッチすることもできません。完了するまでに長い時間がかかり、発送をどれだけ遅らせるかわかりません.

NotifyFilters.Attributes フラグもリッスンすると、元に戻す操作のすべてのサブアイテムに対して ResourceChanged イベントが発生することに気付きましたが、ResourceChanged イベントは他の多くの状況で発生します。決定的な創造イベントを探しています。

助言がありますか?

4

1 に答える 1

0

エクスプローラーでファイルを削除すると、ファイルはごみ箱に移動されます。ファイルがごみ箱から復元された場合は、ウォッチャーをごみ箱に追加することで検出できます。ごみ箱のパスを見つけるのは少し難しいですが、次のコードでうまくいきます。

WindowsIdentity currentUser = WindowsIdentity.GetCurrent();
string path = string.Format(@"C:\$Recycle.Bin\{0}", currentUser.User.Value);
FileSystemWatcher w = new FileSystemWatcher(path, "*.*");
w.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName | NotifyFilters.Attributes | NotifyFilters.Size;
w.IncludeSubdirectories = true;
w.Changed += watcher_Changed;
w.Created += watcher_Created;
w.Renamed += watcher_Renamed;
w.Deleted += watcher_Deleted;
w.EnableRaisingEvents = true;
于 2013-10-14T15:31:20.357 に答える