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

わんくま同盟

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

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


■88613 / )  Re[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 → なし
返信 編集キー/


管理者用

- Child Tree -