Directory.EnumerateFiles
を使用しているときに、ファイルやディレクトリを削除または移動することは安全ですか?このようなファイルシステムを列挙している間に削除または移動することは安全ですか?
何か:私は一般的に、あなたはあなたが列挙しているものを変更することになっていない、ということを知っている
foreach (var fileName in Directory.EnumerateFiles("Sub"))
File.Delete(fileName);
。しかし、上記のコードが動作するので、ファイルシステムはそのルールに従っていないようです。
EnumerateDirectories
およびEnumerateFileSystemEntries
に同じ質問が適用され、同様の問題がDirectoryInfo
クラスの同等のメソッドに適用されます。
関連:[反復中にディレクトリコンテンツが変更された場合、Directory.EnumerateFilesはどうなりますか?](http://stackoverflow.com/questions/29555761/what-happens-with-directory-enumeratefiles-if-directory-content-changes -during-i) – stuartd
あなたが話しているルールは 'foreach'で基礎となるコレクションを変更することに適用されます。これは'IEnumerator'を無効にするためです。この場合、基礎となるデータはコレクションにはなく、より多くのファイル名のストリームのように配信されます。あるいは、 'GetFiles'を使用した場合、基本となるコレクションは配列ですが、削除する配列は変更していません。 – juharr
列挙中にリスト内のオブジェクトを削除または移動するときは、(i = length - 1、i> = 0、i--)のリストを逆方向に移動する必要があります。問題は、インデックスを作成しているアイテムを削除したときです。アイテム2を削除すると、アイテム3は2になり、列挙の中でオリジナルアイテム3をスキップします。 – jdweng