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

わんくま同盟

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

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

■88613 / 8階層)  フォルダ名とその更新日時を一緒に収得
□投稿者/ 魔界の仮面弁士 (1840回)-(2018/09/10(Mon) 23:42:40)
No88608 (なつ さん) に返信
> 既に頭の中は混乱状態、思ってたよりは随分とややっこしいのですね。

No88585 の時点で、DirectoryInfo にどういうメンバーが含まれているかは調査済みで、
それでも調査しきれなかったという点についても、追加質問に対して、短いコード例を
つけて回答したので、それで分かってもらえるものと思い込んでいました。反省。


DirectoryInfo にどんなメンバーがあるかは、DataGridView に渡すことで一覧できます。
DirectoryInfo のプロパティに、日付情報も同時に記録されていることが一望できるかと。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
  Dim sDir As String = "C:\Users\○○○\○○○\SONY NNC\SNNC30"
  DataGridView1.DataSource = New DirectoryInfo(sDir).GetDirectories("*", SearchOption.AllDirectories)
End Sub


上記では、コントロールに表示するために GetDirectories を使いましたが、
No88598 でも述べたように、 EnumerateDirectories を使って LINQ や For Each での
順次列挙を行うこともできます。


Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
 Dim sDir As String = "C:\Users\○○○\○○○\SONY NNC\SNNC30"
 For Each di In New DirectoryInfo("C:\TEST").EnumerateDirectories("*", SearchOption.AllDirectories)
   Debug.WriteLine($"作成={di.CreationTime}, 更新={di.LastWriteTime}, パス={di.FullName}")
 Next
End Sub

Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
 Dim sDir As String = "C:\Users\○○○\○○○\SONY NNC\SNNC30"
 For Each di In New DirectoryInfo("C:\TEST").GetDirectories("*", SearchOption.AllDirectories)
   Debug.WriteLine($"作成={di.CreationTime}, 更新={di.LastWriteTime}, パス={di.FullName}")
 Next
End Sub

Button2 は EnumerateDirectories による列挙、
Button3 は GetDirectories による列挙にしてあります。

いずれも Debug.WriteLine により、「イミディエイト」ウィンドウもしくは「出力」ウィンドウに
作成日時、更新日時、ディレクトリ名を列挙するだけの処理です。


sDir に、フォルダ数が多いパスを与えてみてください。
EnumerateDirectories ではすぐに列挙が始まるのに、
GetDirectories では列挙開始まで時間がかかってしまいます。


また、sDir に "C:\Windows" などを与えると、アクセス権の問題から
例外で停止してしまうことになります。これが No88598 で述べていた注意点です。
>> UnauthorizedAccessException 例外等により、処理が中断されてしまうことになります。



> Dim x As IEnumerable(Of String) = System.IO.Directory.EnumerateDirectories("C:\Users\○○○\○○○\SONY NNC\SNNC30", "*", System.IO.SearchOption.AllDirectories)
> ただ疑問なのは、x は 同じString でありながらも、
同じ…では無いですよね?
x の型は「String」でも「String()」でもなく、「IEnumerable(Of String)」なのですから。



> 何故か ListBox1.Items.AddRange(x) とは出来ないのかです。
AddRange メソッドの引数に渡せる型は「Object()」だからですね。
(Hongliang さんの回答にあるとおり、もう一つのオーバーロードもありますが)

でもって、IEnumerable(Of String) は一次元配列ではありませんから、
Object() に変換することができません。ゆえに、AddRange には渡せないということです。


配列化するために『ListBox1.Items.AddRange(x.ToArray())』のように呼べば渡せますが、
それなら最初から、EnumerateDirectories ではなく GetDirectories を使えば済みますね。


ただし LINQ で再加工するような処理においては、EnumerateDirectories の方が良いでしょう。


Dim q = From di In New DirectoryInfo(sDir).EnumerateDirectories("*", SearchOption.AllDirectories)
    Select $"作成={di.CreationTime}, 更新={di.LastWriteTime}, パス={di.FullName}"

ListBox1.Items.AddRange(q.ToArray())



> NET Framework は4.0のようです。
NET ではなく .NET (ドットネット) ですね。

Jitta さんの回答に補足して、.NET Framework のライフサイクルの表を載せておきます。
(.NET Framework 4 / 4.5 / 4.5.1 のサポートは、2016 年 1 月 12 日で終了しています)


4.7.2 → 2018/02/05 ライフサイクル開始、サポート中(OS のサポート期限まで)★現在の最新版★
4.7.1 → 2017/10/17 ライフサイクル開始、サポート中(OS のサポート期限まで)
4.7  → 2017/04/05 ライフサイクル開始、サポート中(OS のサポート期限まで)
4.6.2 → 2016/08/02 ライフサイクル開始、サポート中(OS のサポート期限まで)
4.6.1 → 2015/11/30 ライフサイクル開始、サポート中(OS のサポート期限まで)
4.6  → 2015/07/20 ライフサイクル開始、サポート中(OS のサポート期限まで)
4.5.2 → 2014/05/05 ライフサイクル開始、サポート中(OS のサポート期限まで)
4.5.1 → 2013/09/07 ライフサイクル開始、2016/01/12 で既にサポート切れ
4.5  → 2012/08/05 ライフサイクル開始、2016/01/12 で既にサポート切れ
4.0  → 2010/03/31 ライフサイクル開始、2012/03/04 Update 3(4.0.3)、2016/01/12 で既にサポート切れ
3.5  → 2007/11/19 ライフサイクル開始、2008/11/18 Service Pack 1(3.5.1)、サポート中(OS のサポート期限まで)
3.0  → 2006/11/19 ライフサイクル開始、2008/08/12 Service Pack 2、2011/07/12 で既にサポート切れ
2.0  → 2005/11/07 ライフサイクル開始、2009/01/16 Service Pack 2、2011/07/12 で既にサポート切れ
1.1  → 2003/04/01 ライフサイクル開始、2004/09/09 Service Pack 1、2013/10/08 で既にサポート切れ
1.0  → 2002/01/05 ライフサイクル開始、2004/09/09 Service Pack 3、2009/07/14 で既にサポート切れ

※ライフサイクルの開始日は、リリース日とは異なります。


4.7.2 を同梱している OS → Windows 10 ver1803
4.7.1 を同梱している OS → Windows 10 ver1709
4.7  を同梱している OS → Windows 10 ver1703
4.6.2 を同梱している OS → Windows 10 ver1607
4.6.1 を同梱している OS → Windows 10 ver1511
4.6  を同梱している OS → Windows 10 ver1507
4.5.2 を同梱している OS → なし
4.5.1 を同梱している OS → Windows 8.1
4.5  を同梱している OS → Windows 8
4.0  を同梱している OS → なし
3.5.x を同梱している OS → Vista 〜 Windows 10
3.0  を同梱している OS → Vista 〜 Windows 10
2.0  を同梱している OS → Vista 〜 Windows 10
1.1  を同梱している OS → なし
1.0  を同梱している OS → なし
編集キー/

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

フォルダ名とその更新日時を一緒に収得 / なつ (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
        └ Re[5]: フォルダ名とその更新日時を一緒に収得 / 魔界の仮面弁士 (18/09/10(Mon) 03:48) #88598
          ├ 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 解決済み
          │  └ フォルダ名とその更新日時を一緒に収得 / 魔界の仮面弁士 (18/09/10(Mon) 23:42) #88613 ←Now
          │    └ 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 解決済み

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