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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.88598 の関連記事表示

<< 0 >>
■88598  Re[5]: フォルダ名とその更新日時を一緒に収得
□投稿者/ 魔界の仮面弁士 -(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 しながら
    再帰的に列挙した方が良いかも知れません。
記事No.88574 のレス /過去ログ152より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -