.NET TIPS

ファイルやディレクトリの一覧を取得するには?

デジタルアドバンテージ
2003/08/02

 指定したディレクトリに含まれるすべてのファイルやディレクトリの名前を取得するには、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:\

指定されたディレクトリ以下のすべてのファイルを表示するC#のサンプル・プログラム(allfile1.cs)

 上記のサンプル・プログラムでは、サブディレクトリを走査するためにメソッドの再帰呼び出し(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:\

再帰呼び出しを行わずにすべてのファイルを表示するC#のサンプル・プログラム(allfile2.cs)

 このサンプル・プログラムでは、各ディレクトリから得られたディレクトリ一覧を順に1つずつ処理していくために、ディレクトリのパス名をいったんキュー(queue)に格納している。キューの実装は、Queueクラス(System名前空間)としてライブラリで用意されている。Dequeueメソッドはキューの先頭から要素を取り出し、Enqueueメソッドはキューの末尾にデータを追加するためのものだ。

DirectoryInfoクラスの3つのメソッド

 「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:\

DirectoryInfoクラスを使用してすべてのファイルを表示するC#のサンプル・プログラム(allfile3.cs)

 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

ファイルの検索を行うC#のサンプル・プログラム(findfile.cs)

 このファイル検索プログラムは、コマンドラインの第1引数に検索を開始するディレクトリを、第2引数に検索するファイルのパターン(“*.cs”など)を指定して使用する。End of Article

カテゴリ:クラス・ライブラリ 処理対象:ディレクトリ&ファイル
使用ライブラリ:Directoryクラス(System.IO名前空間)
使用ライブラリ:DirectoryInfoクラス(System.IO名前空間)
使用ライブラリ:Queueクラス(System名前空間)
使用ライブラリ:FileInfoクラス(System.IO名前空間)
使用ライブラリ:FileSystemInfoクラス(System.IO名前空間)
関連TIPS:ディレクトリを作成/削除/リネーム/移動するには?
 
この記事と関連性の高い別の.NET TIPS
ディレクトリを作成/削除/リネーム/移動するには?
ファイルやディレクトリをすべてのサブディレクトリから検索するには?
ファイルやディレクトリの一覧を効率的に取得するには?
ファイルやディレクトリのサイズを取得するには?
ファイルやディレクトリの存在を確認するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

更新履歴
【2005/3/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("??");。

TechTargetジャパン

Insider.NET フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

キャリアアップ


- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る
- PR -

ホワイトペーパーTechTargetジャパン

ソリューションFLASH

「ITmedia マーケティング」新着記事

第4回 潜在興味が照らし出す専門メディアの新たな価値
潜在興味を言語化できる武器「Topic Model」を手に入れたことで、消費者の「潜在インサイ...

第3回 Smart Phone時代の超UI/UX改善、CVRアップ術
スマートフォンサイトでショッピングや会員登録をするユーザーは、今後もまだまだ増え続...

第1回 「マス」と「デジタル」は横断して分析できる!
マスの効果は測り難いと言われる一方、マーケティング潮流はオムニチャネルが叫ばれるよ...