.NET TIPS

ファイルやディレクトリの一覧を効率的に取得するには?[4以降、C#、VB]

デジタルアドバンテージ 遠藤 孝信
2010/06/03

 ファイルやディレクトリの一覧を取得するには、Directoryクラス(System.IO名前空間)のGetFilesメソッドやGetDirectoriesメソッドを利用する。

 これらについては、.NET Framework 2.0では、以下のようなメソッドが用意されていた*1

*1 詳しくは「TIPS:ファイルやディレクトリをすべてのサブディレクトリから検索するには?」を参照していただきたい。

メソッド名 動作
GetFiles(対象ディレクトリ) 対象ディレクトリにあるファイルの一覧を取得
GetFiles(対象ディレクトリ, 検索パターン) 対象ディレクトリから検索パターンにマッチするファイルの一覧を取得
GetFiles(対象ディレクトリ, 検索パターン, SearchOption列挙体の値) 第3パラメータに「SearchOption.AllDirectories」を指定することにより、すべてのサブディレクトリも含めてファイルの一覧を取得
ファイル一覧を取得するためのGetFilesメソッド

メソッド名 動作
GetDirectories(対象ディレクトリ) 対象ディレクトリにあるディレクトリの一覧を取得
GetDirectories(対象ディレクトリ, 検索パターン) 対象ディレクトリから検索パターンにマッチするディレクトリの一覧を取得
GetDirectories(対象ディレクトリ, 検索パターン, SearchOption列挙体の値) 第3パラメータに「SearchOption.AllDirectories」を指定することにより、すべてのサブディレクトリも含めてディレクトリの一覧を取得
ディレクトリ一覧を取得するためのGetDirectoriesメソッド

 これらの戻り値はすべて文字列の配列であるが、このことからも分かるように、すべてのファイルやディレクトリの列挙が完了するまで、上記のメソッドの呼び出しは完了しない(戻ってこない)。このため、特にサブディレクトリまで含めた検索を行う場合、ディレクトリ階層が深いケースなどでは、処理がしばらくの間そこで停止してしまうということも起こり得た。

EnumerateFilesメソッドとEnumerateDirectoriesメソッド

 .NET Framework 4では、以下のようなメソッドが新しく追加されている。

メソッド名 動作
EnumerateFiles(対象ディレクトリ) 対象ディレクトリにあるファイルの一覧を取得
EnumerateFiles(対象ディレクトリ, 検索パターン) 対象ディレクトリから検索パターンにマッチするファイルの一覧を取得
EnumerateFiles(対象ディレクトリ, 検索パターン, SearchOption列挙体の値) 第3パラメータに「SearchOption.AllDirectories」を指定することにより、すべてのサブディレクトリも含めてファイルの一覧を取得
ファイル一覧を取得するためのEnumerateFilesメソッド

メソッド名 動作
EnumerateDirectories(対象ディレクトリ) 対象ディレクトリにあるディレクトリの一覧を取得
EnumerateDirectories(対象ディレクトリ, 検索パターン) 対象ディレクトリから検索パターンにマッチするディレクトリの一覧を取得
EnumerateDirectories(対象ディレクトリ, 検索パターン, SearchOption列挙体の値) 第3パラメータに「SearchOption.AllDirectories」を指定することにより、すべてのサブディレクトリも含めてディレクトリの一覧を取得
ディレクトリ一覧を取得するための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名前空間)にも、EnumerateFilesEnumerateDirectoriesメソッドなどが追加されている。詳しくは各リファレンスを参照していただきたい。End of Article

利用可能バージョン:.NET Framework 4以降
カテゴリ:クラス・ライブラリ 処理対象:ディレクトリ&ファイル
使用ライブラリ:Directoryクラス(System.IO名前空間)
使用ライブラリ:IEnumerable<T>クラス(System.Collections.Generic名前空間)
関連TIPS:ファイルやディレクトリをすべてのサブディレクトリから検索するには?

この記事と関連性の高い別の.NET TIPS
ファイルやディレクトリをすべてのサブディレクトリから検索するには?
ファイルやディレクトリの一覧を取得するには?
ディレクトリを作成/削除/リネーム/移動するには?
ディレクトリが空かどうかを調べるには?
ファイルやディレクトリのサイズを取得するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間