指定したディレクトリに含まれるすべてのファイルやディレクトリの名前を取得するには、Directoryクラス(System.IO名前空間)のstaticなメソッドを使用する。C#での取得方法を解説する。
指定したディレクトリに含まれるすべてのファイルやディレクトリの名前を取得するには、Directoryクラス(System.IO名前空間)のstaticなメソッドを使用する。ファイル名の一覧はGetFilesメソッド、ディレクトリ名の一覧はGetDirectoriesメソッドにより取得することができる。また、ファイルとディレクトリの両方をまとめて取得するGetFileSystemEntriesメソッドも用意されている。
これらのメソッドの呼び出しは次のようにして行えばよい。
string[] files = Directory.GetFiles("c:\\");
string[] dirs = Directory.GetDirectories("c:\\");
string[] both = Directory.GetFileSystemEntries("c:\\");
それぞれのメソッドのパラメータには、ディレクトリの絶対パスあるいは相対パスが指定でき、いずれのメソッドも取得した結果を文字列の配列として返す。
次のサンプル・プログラムは、GetFilesメソッドとGetDirectoriesメソッドの2つを使用し、コマンドライン引数で指定されたディレクトリ以下(サブディレクトリも含む)に存在するすべてのファイルを表示する。
// allfile1.cs
using System;
using System.IO;
public class ShowAllFiles1 {
static void DoIt(string dir) {
string[] files = Directory.GetFiles(dir);
foreach (string s in files) {
Console.WriteLine(s);
}
string[] dirs = Directory.GetDirectories(dir);
foreach (string s in dirs) {
DoIt(s);
}
}
static void Main(string[] args) {
if (args.Length == 0) return;
DoIt(args[0]);
}
}
// コンパイル方法:csc allfile1.cs
// 実行例:allfile1 c:\
上記のサンプル・プログラムでは、サブディレクトリを走査するためにメソッドの再帰呼び出し(DoItメソッド内でさらにDoItメソッドを呼び出している)を行っている。参考までに、再帰呼び出しを行わないバージョンも示しておこう。
// allfile2.cs
using System;
using System.IO;
using System.Collections;
public class ShowAllFiles {
static void DoIt(string dir) {
Queue q = new Queue();
q.Enqueue(dir);
while (q.Count > 0) {
string d = (string)q.Dequeue();
string[] files = Directory.GetFiles(d);
foreach (string s in files) {
Console.WriteLine(s);
}
string[] dirs = Directory.GetDirectories(d);
foreach (string s in dirs) {
q.Enqueue(s);
}
}
}
static void Main(string[] args) {
if (args.Length == 0) return;
DoIt(args[0]);
}
}
// コンパイル方法:csc allfile2.cs
// 実行例:allfile2 c:\
このサンプル・プログラムでは、各ディレクトリから得られたディレクトリ一覧を順に1つずつ処理していくために、ディレクトリのパス名をいったんキュー(queue)に格納している。キューの実装は、Queueクラス(System名前空間)としてライブラリで用意されている。Dequeueメソッドはキューの先頭から要素を取り出し、Enqueueメソッドはキューの末尾にデータを追加するためのものだ。
「TIPS:ディレクトリを作成/削除/リネーム/移動するには?」の最後でも解説しているように、ディレクトリを扱うクラスとしてはDirectoryクラス以外にDirectoryInfoクラス(System.IO名前空間)が用意されている。こちらはインスタンス・メソッドだけを実装したクラスで、特定のディレクトリについてインスタンスを作成してから、そのディレクトリについての操作を行う。
このDirectoryInfoクラスにも、Directoryクラスと同様に、ファイルやディレクトリの一覧を取得する3つのメソッドがあり、呼び出し方は次のようになる。
DirectoryInfo di = new DirectoryInfo("c:\\");
FileInfo[] fis = di.GetFiles();
DirectoryInfo[] dis = di.GetDirectories();
FileSystemInfo[] fsis = di.GetFileSystemInfos();
FileInfoクラス(System.IO名前空間)は、特定のファイルについての情報を表すクラスだ。また、GetFileSystemInfosメソッドは、Directory.GetFileSystemEntriesと同様に、DirectoryInfoオブジェクトの基になるディレクトリに含まれているすべてのファイルとディレクトリを、FileSystemInfoクラス(System.IO名前空間)の配列として返す。FileSystemInfoクラスは、FileInfoクラスおよびDirectoryInfoクラスの基底クラスであるため、FileSystemInfo型の配列はそのどちらのインスタンスも格納できる。
さて、Directoryクラスの代わりにDirectoryInfoクラスを使用して最初のサンプル・プログラム(allfile1.cs)を書き換えると次のようになる。
// allfile3.cs
using System;
using System.IO;
public class ShowAllFiles3 {
static void DoIt(DirectoryInfo di) {
FileInfo[] fis = di.GetFiles();
foreach (FileInfo f in fis) {
Console.WriteLine(f.FullName);
}
DirectoryInfo[] dis = di.GetDirectories();
foreach (DirectoryInfo d in dis) {
DoIt(d);
}
}
static void Main(string[] args) {
if (args.Length == 0) return;
DoIt(new DirectoryInfo(args[0]));
}
}
// コンパイル方法:csc allfile3.cs
// 実行例:allfile3 c:\
FileInfoクラスのFullNameプロパティは、インスタンスの基となっているファイルの絶対パスを取得するものだ。このプロパティを使用しているため、コマンドライン引数で相対ディレクトリを指定して実行した場合には、元のサンプル・プログラムとは表示形式が少し異なっている。
ここまでに見てきた合計6つのメソッドは、ワイルドカード文字(*:0個以上の文字、?:1文字)を使用したパターンをメソッドのパラメータで指定することにより、対象となるディレクトリ内でファイルやディレクトリを検索することができる。
まずDirectoryクラスのメソッドでは、次のようにして検索を行える。
string[] files = Directory.GetFiles("c:\\", "*.cs");
string[] dirs = Directory.GetDirectories("c:\\", "*Microsoft*");
string[] both = Directory.GetFileSystemEntries("c:\\", "??");
この例では、上から順に、拡張子が“.cs”のファイル、“Microsoft”を含むディレクトリ、名前が2文字以内のディレクトリかファイルを、Cドライブのルート・ディレクトリから検索する。
同様に、DirectoryInfoクラスを使用する場合の記述例は次のようになる。
DirectoryInfo di = new DirectoryInfo("c:\\");
FileInfo[] fis = di.GetFiles("*.cs");
DirectoryInfo[] dis = di.GetDirectories("*Microsoft*");
FileSystemInfo[] fsis = di.GetFileSystemInfos("??");
次のサンプル・プログラムは、最初のサンプル・プログラム(allfile1.cs)をほんの少し書き換えて作成したファイル検索プログラムだ。
// findfile.cs
using System;
using System.IO;
public class FildFile {
static void Search(string dir, string file) {
string[] files = Directory.GetFiles(dir, file);
foreach (string s in files) {
Console.WriteLine(s);
}
string[] dirs = Directory.GetDirectories(dir);
foreach (string s in dirs) {
Search(s, file);
}
}
static void Main(string[] args) {
if (args.Length != 2) return;
Search(args[0], args[1]);
}
}
// コンパイル方法:csc findfile.cs
// 実行例:findfile c:\ *.cs
このファイル検索プログラムは、コマンドラインの第1引数に検索を開始するディレクトリを、第2引数に検索するファイルのパターン(“*.cs”など)を指定して使用する。
カテゴリ:クラス・ライブラリ 処理対象:ディレクトリ&ファイル
使用ライブラリ:Directoryクラス(System.IO名前空間)
使用ライブラリ:DirectoryInfoクラス(System.IO名前空間)
使用ライブラリ:Queueクラス(System名前空間)
使用ライブラリ:FileInfoクラス(System.IO名前空間)
使用ライブラリ:FileSystemInfoクラス(System.IO名前空間)
関連TIPS:ディレクトリを作成/削除/リネーム/移動するには?
【2005/03/29】本記事の一部に以下のような誤りがありました。お詫びして訂正させていただきます。
<誤>
まずDirectoryクラスのメソッドでは、次のようにして検索を行える。
string[] files = Directory.GetFiles("c:\\", "*Microsoft*");
string[] dirs = Directory.GetDirectories("c:\\", "*.cs");
string[] both = Directory.GetFileSystemEntries("c:\\", "??");
この例では、上から順に、“Microsoft”を含むディレクトリ、拡張子が“.cs”のファイル、名前が2文字以内のディレクトリかファイルを、Cドライブのルート・ディレクトリから検索する。
同様に、DirectoryInfoクラスを使用する場合の記述例は次のようになる。
DirectoryInfo di = new DirectoryInfo("c:\\");
FileInfo[] fis = di.GetFiles("*Microsoft*");
DirectoryInfo[] dis = di.GetDirectories("*.cs");
FileSystemInfo[] fsis = di.GetFileSystemInfos("??");
<正>
まずDirectoryクラスのメソッドでは、次のようにして検索を行える。
string[] files = Directory.GetFiles("c:\\", "*.cs");
string[] dirs = Directory.GetDirectories("c:\\", "*Microsoft*");
string[] both = Directory.GetFileSystemEntries("c:\\", "??");
この例では、上から順に、拡張子が“.cs”のファイル、“Microsoft”を含むディレクトリ、名前が2文字以内のディレクトリかファイルを、Cドライブのルート・ディレクトリから検索する。
同様に、DirectoryInfoクラスを使用する場合の記述例は次のようになる。
DirectoryInfo di = new DirectoryInfo("c:\\");
FileInfo[] fis = di.GetFiles("*.cs");
DirectoryInfo[] dis = di.GetDirectories("*Microsoft*");
FileSystemInfo[] fsis = di.GetFileSystemInfos("??");。
【2003/08/02】初版公開。
Copyright© Digital Advantage Corp. All Rights Reserved.