| ■No88597 (なつ さん) に返信 > 調べてもいますし試してもいるのですが どこまで分かっているのか、調べた範囲までを 今回のように提示していただけると助かります。
同時とは言いますが、かつての TxF (トランザクションNTFS) のような仕組みでもない限り、 列挙操作中に、更新や削除が行われる可能性は否定できないと思います。 ドライブごと排他ロックするわけにもいかないでしょうから、 どこまでの同時性を求めているのかが、最初の質問からは読み取れませんでした。
> Dim Directori As String() = System.IO.Directory.GetDirectories("C:\Users\○○○\○○○", "*", System.IO.SearchOption.AllDirectories) > Dim Directori_Update As DateTime = System.IO.File.GetLastWriteTime(Directori(0)) System.IO.Directory.GetDirectories は戻り値が配列であるがゆえに、 すべてを列挙し終えるまで、結果が返却されません。
その意味においては、System.IO.Directory.EnumerateDirectories の方が都合が良いでしょう。 Dim x As IEnumerable(Of String) = Directory.EnumerateDirectories(strFolder, "*", SearchOption.AllDirectories)
こちらは順次列挙ですので、直ちに検索結果の返却が始まりますので、 For Each あるいは LINQ での処理との相性も良いかと思います。
さらに言えば、System.IO.Directory クラスだと、列挙されるのはあくまでパス名だけですので、 これを System.IO.DirectoryInfo クラスに置き換えることで、さらに効率が良くなります。 Dim y = New System.IO.DirectoryInfo(strFolder).EnumerateDirectories("*", SearchOption.AllDirectories)
とはいえいずれの方法であっても、先に述べた通り、列挙操作中の外部からの更新や削除は防げません。 また AllDirectories 指定の場合、下位のディレクトリでアクセス権の無いパスがあると UnauthorizedAccessException 例外等により、処理が中断されてしまうことになります。
アクセス権の無いパスをスキップして処理する必要がある場合は、 Public Iterator Function EnumAllDir(dirPath As DirectoryInfo) As IEnumerable(Of DirectoryInfo) といったメソッドを自作して、その中で TopDirectoryOnly 指定で Try〜Catch しながら 再帰的に列挙した方が良いかも知れません。 |