Visual C# を使用してディレクトリを再帰的に検索する方法

Microsoft Visual C++ .NET については、次の資料を参照してください。 307009 .

Microsoft Visual Basic .NET については、次の資料を参照してください。 306666 .


この資料では、次の Microsoft .NET Framework クラス ライブラリの名前空間を参照しています。
  • System.IO

概要

この資料では、C# Windows Forms アプリケーションで、サブディレクトリを再帰的に調べてファイルを検索する方法について手順を追って説明します。検索文字列を指定して、特定のワイルドカード条件に一致するファイルを検索できるようにします。必要に応じて、コードの各部分について説明しています。資料の最後に、実際に動作するコード サンプルも示します。

ディレクトリの再帰呼び出しは、開発者にとって一般的な入出力作業です。コンポーネント オブジェクト モデル (COM) アプリケーションでは、FileSystemObject を使用して、この処理を簡単に実行できます。.NET では、これがさらに簡単になりました。FileSystemObject の場合と同様、System.IO 名前空間内のクラスに、ファイルやディレクトリに対するオブジェクト指向のアクセス方法が用意されています。

必要条件

  • Microsoft Visual C# 2005 または Microsoft Visual C# .NET

ディレクトリの再帰呼び出し

ファイルおよびディレクトリを操作するクラスは、System.IO 名前空間にあります。これらのクラスを使用する前に、以下の名前空間をプロジェクトにインポートする必要があります。
using System.IO;
System.IO 名前空間には、ファイルやディレクトリを操作できる多くのクラスがあります。これらのクラスには、ファイル クラス、ディレクトリ クラス、ユーティリティ クラスがあります。これらのクラスの多くには、その型の変数を宣言しなくとも呼び出すことができる静的メソッドが含まれています。たとえば、Directory オブジェクトを使用して、特定のディレクトリのサブディレクトリを取得できます。

以下のコードでは、Directory オブジェクトの静的メソッド GetDirectories を使用して文字列の配列を取得します。この配列には、C:\ ディレクトリのサブディレクトリ (存在する場合) へのディレクトリ パス名が含まれています。
string[] directories = Directory.GetDirectories("C:\\");
また、Directory オブジェクトには、GetFiles と呼ばれるメソッドもあります。このメソッドを使用して、特定の条件に一致するファイルの文字列型配列を取得できます。次のコード サンプルでは、File オブジェクトを使用して、C:\ ディレクトリにある .dll 拡張子で終わるすべてのファイルを取得します。
string[] files = Directory.GetFiles("C:\\", "*.dll");
Directory オブジェクトの GetDirectories メソッドと GetFiles メソッドを使用すると、検索文字列に一致するファイルを再帰的に検索することができます。再帰呼び出しを実行するには、以下の方法を使用します。
void DirSearch(string sDir) 
{
try
{
foreach (string d in Directory.GetDirectories(sDir))
{
foreach (string f in Directory.GetFiles(d, txtFile.Text))
{
lstFilesFound.Items.Add(f);
}
DirSearch(d);
}
}
catch (System.Exception excpt)
{
Console.WriteLine(excpt.Message);
}
}
上記のコードでは、検索するディレクトリが含まれている文字列を DirSearch に渡します。この文字列値は、ディレクトリの完全なパスです。GetDirectories を使用すると、プロシージャに渡されるディレクトリのサブディレクトリを取得できます。GetDirectories は配列を返すため、for/each ステートメントを使用して、各サブディレクトリについて反復処理を行うことができます。各サブディレクトリでは、GetFiles メソッドを使用してディレクトリ内のファイルについて反復処理を行います。GetFiles には、フォーム上のテキスト ボックスの値が渡されます。このテキスト ボックスには、GetFiles から返される結果をフィルター処理する検索文字列が含まれています。検索条件に一致するファイルがあれば、リスト ボックスに追加されます。配置されているサブディレクトリごとに DirSearch を再度呼び出し、サブディレクトリを渡します。このような再帰呼び出しを使用することによって、所定のルート ディレクトリのすべてのサブディレクトリを検索できます。

完全なコード サンプル

  1. Visual C# の新しい Windows アプリケーション プロジェクトを開始します。既定で Form1 というフォームが作成されます。
  2. [表示] メニューの [ソリューション エクスプローラー] をクリックして表示します。
  3. ソリューション エクスプローラーで [Form1.cs] を右クリックし、[コードの表示] をクリックします。
  4. Form1 のコード ウィンドウで、表示されているコードをすべて強調表示し、削除します。
  5. Form1 のコード ウィンドウに以下のコードを貼り付けます。
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    using System.IO;

    namespace RecursiveSearchCS
    {
    /// <summary>
    /// Summary description for Form1
    /// </summary>
    public class Form1 : System.Windows.Forms.Form
    {
    internal System.Windows.Forms.Button btnSearch;
    internal System.Windows.Forms.TextBox txtFile;
    internal System.Windows.Forms.Label lblFile;
    internal System.Windows.Forms.Label lblDirectory;
    internal System.Windows.Forms.ListBox lstFilesFound;
    internal System.Windows.Forms.ComboBox cboDirectory;
    /// <summary>
    /// Required designer variable
    /// </summary>
    private System.ComponentModel.Container components = null;

    public Form1()
    {
    //
    // Required for Windows Form Designer support
    //
    InitializeComponent();

    //
    // TODO: Add any constructor code after InitializeComponent call.
    //
    }

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if (components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    }

    #region Windows Form Designer generated code
    /// <summary>
    /// Required method for Designer support: do not modify
    /// the contents of this method with the code editor.
    /// </summary>
    private void InitializeComponent()
    {
    this.btnSearch = new System.Windows.Forms.Button();
    this.txtFile = new System.Windows.Forms.TextBox();
    this.lblFile = new System.Windows.Forms.Label();
    this.lblDirectory = new System.Windows.Forms.Label();
    this.lstFilesFound = new System.Windows.Forms.ListBox();
    this.cboDirectory = new System.Windows.Forms.ComboBox();
    this.SuspendLayout();
    //
    // btnSearch
    //
    this.btnSearch.Location = new System.Drawing.Point(608, 248);
    this.btnSearch.Name = "btnSearch";
    this.btnSearch.TabIndex = 0;
    this.btnSearch.Text = "Search";
    this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click);
    //
    // txtFile
    //
    this.txtFile.Location = new System.Drawing.Point(8, 40);
    this.txtFile.Name = "txtFile";
    this.txtFile.Size = new System.Drawing.Size(120, 20);
    this.txtFile.TabIndex = 4;
    this.txtFile.Text = "*.dll";
    //
    // lblFile
    //
    this.lblFile.Location = new System.Drawing.Point(8, 16);
    this.lblFile.Name = "lblFile";
    this.lblFile.Size = new System.Drawing.Size(144, 16);
    this.lblFile.TabIndex = 5;
    this.lblFile.Text = "Search for files containing:";
    //
    // lblDirectory
    //
    this.lblDirectory.Location = new System.Drawing.Point(8, 96);
    this.lblDirectory.Name = "lblDirectory";
    this.lblDirectory.Size = new System.Drawing.Size(120, 23);
    this.lblDirectory.TabIndex = 3;
    this.lblDirectory.Text = "Look In:";
    //
    // lstFilesFound
    //
    this.lstFilesFound.Location = new System.Drawing.Point(152, 8);
    this.lstFilesFound.Name = "lstFilesFound";
    this.lstFilesFound.Size = new System.Drawing.Size(528, 225);
    this.lstFilesFound.TabIndex = 1;
    //
    // cboDirectory
    //
    this.cboDirectory.DropDownWidth = 112;
    this.cboDirectory.Location = new System.Drawing.Point(8, 128);
    this.cboDirectory.Name = "cboDirectory";
    this.cboDirectory.Size = new System.Drawing.Size(120, 21);
    this.cboDirectory.TabIndex = 2;
    this.cboDirectory.Text = "ComboBox1";
    //
    // Form1
    //
    this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
    this.ClientSize = new System.Drawing.Size(688, 277);
    this.Controls.AddRange(new System.Windows.Forms.Control[] {

    this.btnSearch,
    this.txtFile,
    this.lblFile,
    this.lblDirectory,
    this.lstFilesFound,
    this.cboDirectory});

    this.Name = "Form1";
    this.Text = "Form1";
    this.Load += new System.EventHandler(this.Form1_Load);
    this.ResumeLayout(false);

    }
    #endregion

    /// <summary>
    /// The main entry point for the application
    /// </summary>
    [STAThread]
    static void Main()
    {
    Application.Run(new Form1());
    }

    private void btnSearch_Click(object sender, System.EventArgs e)
    {
    lstFilesFound.Items.Clear();
    txtFile.Enabled = false;
    cboDirectory.Enabled = false;
    btnSearch.Text = "Searching...";
    this.Cursor = Cursors.WaitCursor;
    Application.DoEvents();
    DirSearch(cboDirectory.Text);
    btnSearch.Text = "Search";
    this.Cursor = Cursors.Default;
    txtFile.Enabled = true;
    cboDirectory.Enabled = true;
    }

    private void Form1_Load(object sender, System.EventArgs e)
    {
    cboDirectory.Items.Clear();
    foreach (string s in Directory.GetLogicalDrives())
    {
    cboDirectory.Items.Add(s);
    }
    cboDirectory.Text = "C:\\";
    }

    void DirSearch(string sDir)
    {
    try
    {
    foreach (string d in Directory.GetDirectories(sDir))
    {
    foreach (string f in Directory.GetFiles(d, txtFile.Text))
    {
    lstFilesFound.Items.Add(f);
    }
    DirSearch(d);
    }
    }
    catch (System.Exception excpt)
    {
    Console.WriteLine(excpt.Message);
    }
    }
    }
    }
    注: Visual Studio 2005 および Visual Studio 2008 では、コードを変更する必要があります。Visual Studio 2005 より前のバージョンの Visual Studio では、Windows フォーム プロジェクトを作成すると、Visual C# によって既定で Form1 というフォームが 1 つ追加されます。Visual C# 2005 以降のバージョンでは、フォームを表す 2 つのファイルには Form1.cs および Form1.Designer.cs という名前が付けられます。Form1.cs にはコードを記述します。Windows フォーム デザイナーにより、Form1.designer.cs ファイルにコードが書き込まれます。

    サンプル コードを Visual C# 2005 または Visual C# 2008 に変換するには、新しい Visual C# Windows アプリケーションを作成し、次の手順に従います。
    1. Button オブジェクト、Text box オブジェクト、および他の Windows オブジェクトを、Form1.Designer.cs ファイル内の部分クラス Form1 にコピーします。
    2. 上のコードの InitializeComponent メソッド セクションの内容を Form1.Designer.cs ファイル内の InitializeComponent メソッドに追加します。InitializeComponent メソッドの現在の内容の後にその内容を貼り付けます。
    3. 上のコードから以下のメソッドを Form1.cs ファイルの Form1 クラス内に貼り付けます。
      • btnSearch_Click
      • Form1_Load
      • DirSearch
    4. using System.IO; ステートメントを Form1.cs ファイルに追加します。
    Windows フォーム デザイナーに関する詳細については、次の Microsoft Developer Network (MSDN) Web サイトを参照してください。
  6. F5 キーを押してサンプル プログラムをビルドし、実行します。

関連情報

詳細については、以下のサポート技術情報番号をクリックしてください。

306777 System.IO と Visual C# を使用してテキスト ファイルを読み取る方法

プロパティ

文書番号:303974 - 最終更新日: 2013/08/23 - リビジョン: 1

Microsoft Visual C# 2005, Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# 2008 Express Edition

フィードバック