C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■88598 / )  Re[5]: フォルダ名とその更新日時を一緒に収得
□投稿者/ 魔界の仮面弁士 (1836回)-(2018/09/10(Mon) 03:48:06)
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 しながら
再帰的に列挙した方が良いかも知れません。
返信 編集キー/


管理者用

- Child Tree -