1

ファイルシステムの変更を監視し、ファイル表現のコンテナを更新するコードがいくつかあります。ディレクトリの名前を変更するまで、ほとんどすべてが機能します。名前が変更されたディレクトリのすべてのファイルとサブフォルダには新しいパスがあるため、名前変更イベントが発生することを期待しますが、親ディレクトリの名前が変更されたというメッセージが1つだけ表示されます。忘れてしまったイベントや、設定が必要な旗はありますか?現在、ディレクトリの名前変更とコレクションの反復処理を行ってファイルを新しい名前に更新していますが、代わりに各ファイルの通知を受け取るための何かが必要だと感じています。

私のセットアップ:

FileSystemWatcher watcher = new FileSystemWatcher(item.Path);
watcher.EnableRaisingEvents = true;
watcher.Created += new System.IO.FileSystemEventHandler(OnMediaCreated);
watcher.Deleted += new System.IO.FileSystemEventHandler(OnMediaDeleted);
watcher.Changed += new System.IO.FileSystemEventHandler(OnMediaChanged);
watcher.Renamed += new System.IO.RenamedEventHandler(OnMediaRenamed);
4

3 に答える 3

2

コンテナの名前が変更されても、含まれているファイルが変更されているとは通常考えられないと思います。これが、含まれているファイルのイベントを取得しない理由です。

ディレクトリ構造の二重リンクツリー表現を作成して、各ファイルとディレクトリがそのコンテナを認識できるようにすることをお勧めします。次に、ツリーをルートまでトラバースするファイル表現でToString()オーバーライドを作成します。表示文字列を作成します。

ディレクトリの名前変更イベントを取得すると、表現内のディレクトリを見つけて、このブランチからリーフアウトする各ファイルの更新をトリガーできます。

そうすれば、物事をループする必要はありませんが、よりエレガントに思える場合は、再帰を使用します。

また、FileSystemWatcherにはバッファオーバーフローの問題があるため、イベントが失われないようにチェックアウトする必要があることに注意してください。

于 2012-07-25T21:42:22.237 に答える
1

まず、投稿内で一貫した用語を使用してください。あなたは、ディレクトリ、フォルダ、およびファイルについてほぼ同じ意味で言及しました。議論のために、これをフォルダとファイルにドロップします。あなたが説明していることから、あなたはファイルとおそらくサブフォルダを含むフォルダを見ています。フォルダの名前を変更し、すべてのファイル(および該当する場合はサブフォルダ)のメディア名前変更イベントも発生することを期待していますか?いいえ、あなたがそれらを手に入れるとは思わない。

FileSystemWatcherは、フォルダー自体ではなく、フォルダーの内容を監視するためにフックします。この動作を確認するには、フォルダーにフックしてフォルダーの名前を変更してから、フォルダー内のアイテムの名前を変更します。(そして変更のフルパスを表示します)名前が変更されたアイテムのパスが元のフォルダー名を保持していることに気付くでしょう。フォルダの名前を変更してもウォッチャーは無効になりませんが、イベントはキャッチされません。ただし、監視対象フォルダーの下にサブフォルダーがあり、その下にファイルがあり、サブフォルダーとその子ファイルの名前を変更すると、子のフルパスに親フォルダーの名前の変更が反映されます。説明するのは難しいですが:(IncludeSubdirectories= true)

Folder1 (watched)   
  File1   
  Folder2
    File2

フォルダ1の名前を変更してからファイル1に名前を変更します。フォルダ1の名前の変更は検出されず、ファイル1も変更を実行しません。名前は変わりませんでした。Folder1の名前を変更した後でFile1の名前を変更しても、パスとして「Folder1」が表示されます。Folder2の名前変更が検出され、新しい名前が報告されます。Folder2の名前が変更された後にFile2の名前が変更されたことが検出され、File2のフルパスに更新されたFolder2フォルダー名が表示されます。

監視対象ディレクトリへの名前変更を検出する場合、実際に行う必要があるのは、実際に関心のあるディレクトリに設定されたフィルタを使用して、その上のディレクトリレベルを監視することです。IncludeSubdirectoriesで1つのFSWを使用するか、2つのファイルシステムウォッチャーを使用します。 1つはフォルダを監視し、もう1つはその内容を監視します。フォルダの変更が検出されたら、必要に応じてフォルダ名の変更で外部参照を更新してから、パス名が正しく返されるようにコンテンツウォッチャーを再初期化します。

于 2012-07-25T22:23:14.777 に答える
0

FileSystemWatcherオブジェクトを有効にしてサブディレクトリを含める必要があります。

watcher.IncludeSubdirectories = true;
于 2012-07-26T09:57:48.253 に答える