|
.NET TIPS
ファイルやディレクトリの一覧を効率的に取得するには?[4以降、C#、VB]
デジタルアドバンテージ 遠藤 孝信
2010/06/03 |
 |
|
ファイルやディレクトリの一覧を取得するには、Directoryクラス(System.IO名前空間)のGetFilesメソッドやGetDirectoriesメソッドを利用する。
これらについては、.NET Framework 2.0では、以下のようなメソッドが用意されていた*1。
|
ファイル一覧を取得するためのGetFilesメソッド |
|
|
ディレクトリ一覧を取得するためのGetDirectoriesメソッド |
|
これらの戻り値はすべて文字列の配列であるが、このことからも分かるように、すべてのファイルやディレクトリの列挙が完了するまで、上記のメソッドの呼び出しは完了しない(戻ってこない)。このため、特にサブディレクトリまで含めた検索を行う場合、ディレクトリ階層が深いケースなどでは、処理がしばらくの間そこで停止してしまうということも起こり得た。
EnumerateFilesメソッドとEnumerateDirectoriesメソッド
.NET Framework 4では、以下のようなメソッドが新しく追加されている。
|
ファイル一覧を取得するためのEnumerateFilesメソッド |
|
|
ディレクトリ一覧を取得するためのEnumerateDirectoriesメソッド |
|
これらのメソッドは、ファイルやディレクトリが見つかり次第、それを返す。戻り値はIEnumerable<string>クラス(VBではIEnumerable(Of String)と記述)*2のオブジェクトとなる。このため、実際にファイル名やディレクトリ名を得るには、foreach文(VBではFor Each文)を使用することになる(あるいはLINQのデータソースとして利用できる)。
*2 System.Collections.Generic名前空間のジェネリック・クラスである、IEnumerable<T>クラス(VBではIEnumerable(Of T)と記述)をString型に適用したクラス。
|
次のコードは、EnumerateFilesメソッドを使用して、単純に「Dドライブ」にあるすべてのファイルを列挙するサンプル・プログラムだが、実行の開始とともにファイルのパスが画面に列挙されるはずだ。
// enumfiles.cs
using System;
using System.IO;
using System.Collections.Generic;
class Program {
static void Main() {
IEnumerable<string> files
= Directory.EnumerateFiles(
@"D:\", // 検索開始ディレクトリ
"*", // 検索パターン
SearchOption.AllDirectories); // サブ・ディレクトも含める
foreach (string file in files) {
Console.WriteLine(file);
}
}
}
// コンパイル方法:csc enumfiles.cs
|
' enumeratefiles.vb
Imports System
Imports System.IO
Imports System.Collections.Generic
Class Program
Shared Sub Main()
Dim files As IEnumerable(Of String) _
= Directory.EnumerateFiles( _
"D:\", _
"*", _
SearchOption.AllDirectories)
For Each file In files
Console.WriteLine(file)
Next
End Sub
End Class
' コンパイル方法:vbc enumeratefiles.vb
|
|
EnumerateFilesメソッドによりファイルを列挙するサンプル・プログラム(上:C#、下:VB) |
なお、Directoryメソッドには、ファイルとディレクトリの両方の一覧を取得するためのEnumerateFileSystemEntriesメソッドも追加されている。また、DirectoryInfoクラス(System.IO名前空間)にも、EnumerateFiles/EnumerateDirectoriesメソッドなどが追加されている。詳しくは各リファレンスを参照していただきたい。
利用可能バージョン:.NET Framework 4以降
カテゴリ:クラス・ライブラリ 処理対象:ディレクトリ&ファイル
使用ライブラリ:Directoryクラス(System.IO名前空間)
使用ライブラリ:IEnumerable<T>クラス(System.Collections.Generic名前空間)
関連TIPS:ファイルやディレクトリをすべてのサブディレクトリから検索するには?
|
|
generated by
|
|
Insider.NET 記事ランキング
本日
月間