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

わんくま同盟

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

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

■88598 / 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 しながら
再帰的に列挙した方が良いかも知れません。
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[4]: フォルダ名とその更新日時を一緒に収得 /なつ →Re[6]: フォルダ名とその更新日時を一緒に収得 /魔界の仮面弁士
→Re[6]: フォルダ名とその更新日時を一緒に収得 /Jitta
 
上記関連ツリー

フォルダ名とその更新日時を一緒に収得 / なつ (18/09/08(Sat) 17:52) #88574
Re[1]: フォルダ名とその更新日時を一緒に収得 / Hongliang (18/09/08(Sat) 21:42) #88582
  └ Re[2]: フォルダ名とその更新日時を一緒に収得 / なつ (18/09/09(Sun) 08:19) #88585
    └ Re[3]: フォルダ名とその更新日時を一緒に収得 / Jitta (18/09/09(Sun) 08:45) #88586
      └ Re[4]: フォルダ名とその更新日時を一緒に収得 / なつ (18/09/10(Mon) 00:16) #88597
        └ フォルダ名とその更新日時を一緒に収得 / 魔界の仮面弁士 (18/09/10(Mon) 03:48) #88598 ←Now
          ├ Re[6]: フォルダ名とその更新日時を一緒に収得 / 魔界の仮面弁士 (18/09/10(Mon) 10:19) #88600
          │└ Re[7]: フォルダ名とその更新日時を一緒に収得 / なつ (18/09/10(Mon) 19:50) #88608
          │  ├ Re[8]: フォルダ名とその更新日時を一緒に収得 / Hongliang (18/09/10(Mon) 20:27) #88609
          │  │└ Re[9]: フォルダ名とその更新日時を一緒に収得 / なつ (18/09/12(Wed) 21:18) #88641 解決済み
          │  ├ Re[8]: フォルダ名とその更新日時を一緒に収得 / Jitta (18/09/10(Mon) 22:12) #88610
          │  │└ Re[9]: フォルダ名とその更新日時を一緒に収得 / なつ (18/09/12(Wed) 21:21) #88642 解決済み
          │  └ Re[8]: フォルダ名とその更新日時を一緒に収得 / 魔界の仮面弁士 (18/09/10(Mon) 23:42) #88613
          │    └ Re[9]: フォルダ名とその更新日時を一緒に収得 / なつ (18/09/12(Wed) 21:10) #88640 解決済み
          │      └ Re[10]: フォルダ名とその更新日時を一緒に収得 / 魔界の仮面弁士 (18/09/13(Thu) 00:34) #88645 解決済み
          │        └ Re[11]: フォルダ名とその更新日時を一緒に収得 / なつ (18/09/13(Thu) 23:23) #88651 解決済み
          └ Re[6]: フォルダ名とその更新日時を一緒に収得 / Jitta (18/09/10(Mon) 10:15) #88599
            └ Re[7]: フォルダ名とその更新日時を一緒に収得 / とっちゃん (18/09/10(Mon) 10:23) #88601
              └ Re[8]: フォルダ名とその更新日時を一緒に収得 / Jitta (18/09/12(Wed) 21:57) #88644 解決済み
                └ Re[9]: フォルダ名とその更新日時を一緒に収得 / なつ (18/09/15(Sat) 10:09) #88653 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信