如何使用 Visual C# 遞迴搜尋目錄

文章翻譯 文章翻譯
文章編號: 303974 - 檢視此文章適用的產品。
本文曾發行於 CHT303974
如需本文的 Microsoft Visual C++ .NET 版本,請參閱 307009.
如需本文的 Microsoft Visual Basic .NET 版本,請參閱 306666.

本文參照下列 Microsoft .NET Framework Class Library 命名空間:
  • System.IO
全部展開 | 全部摺疊

在此頁中

結論

本文將逐步說明如何遞迴搜尋 C# Windows Forms 應用程式中的檔案子目錄。已指定搜尋字串,可讓您搜尋符合特定萬用字元準則的檔案。將視需要說明程式碼的每個部分。文章結尾也會提供可以正常運作的程式碼範例。

目錄遞迴是開發人員的一般 IO 工作。FileSystemObject 可讓元件物件模型 (COM) 應用程式輕鬆執行此工作。現在可以在 .NET 中更輕鬆地執行此工作。與類似 FileSystemObjectSystem.IO 命名空間中的類別會提供物件導向的檔案和目錄存取方式。

需求

  • Microsoft Visual C# 2005 或 Microsoft Visual C# .NET

目錄遞迴

檔案和目錄的管理類別位於 System.IO 命名空間。您應該將下列命名空間匯入您的專案,才能使用這些類別:
using System.IO;
System.IO 命名空間類別提供許多類別,以便您使用的檔案和目錄。這些類別包括檔案類別、目錄類別以及公用程式類別,其中許多包含靜態方法,您毋需宣告該類型的變數即可加以呼叫。例如,您可以使用目錄物件取得指定目錄的子目錄。

下列程式碼使用目錄物件的靜態 GetDirectories 方法來傳回字串陣列。如果有 C 目錄的子目錄路徑名稱,則會包含在此陣列中。
string[] directories = Directory.GetDirectories("C:\\");
目錄物件也包含名為 GetFiles 的方法,以便您擷取符合特定準則的檔案字串陣列。以下程式碼範例會使用檔案物件擷取 C 目錄中所有副檔名為 .dll 的檔案:
string[] files = Directory.GetFiles("C:\\", "*.dll");
若要遞迴搜尋符合搜尋字串的檔案,您只需要使用目錄物件的 GetDirectoriesGetFiles 方法。以下是執行遞迴的方法:
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 會傳回一個陣列,您可以使用每個陳述式來逐一查看每個子目錄。在每個子目錄中則可使用 GetFiles 方法來逐一查看該目錄中的檔案。表單上文字方塊的值會傳遞至 GetFiles,該文字方塊會包含搜尋字串,篩選 GetFiles 傳回的結果。如果檔案符合搜尋條件,則會將之加入您的清單方塊中。對於每個已定位的子目錄,則再次呼叫 DirSearch,並傳遞子目錄。藉由這項遞迴呼叫,您就可以搜尋指定根目錄的所有子目錄。

完整的程式碼範例

  1. 啟動新的 Visual C# Windows 應用程式專案。根據預設,便會建立名為 Form1.cs 的表單。
  2. 按一下 [檢視] 功能表,顯示方案總管。
  3. 在方案總管中,在 [Form1] 上按右鍵,然後按一下 [檢視程式碼]
  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 Form 專案時,Visual C# 會在專案中建立一個表單。該表單名為 Form1。在 Visual C# 2005 和更新的版本中,兩個表示表單的檔案會命名為 Form1.cs 和 Form1.designer.cs,而您在 Form1.cs 中撰寫程式碼。Windows Form 設計工具會在 Form1.designer.cs 檔案中撰寫程式碼。

    若要將範例程式碼轉換至 Visual C# 2005 或 Visual C# 2008,請建立新的 Visual C# Windows 應用程式,然後依照下列步驟執行:
    1. 按鈕物件、文字方塊物件以及其他 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 Form 設計工具的詳細資訊,請造訪下列 Microsoft Developer Network (MSDN) 網站:
    http://msdn.microsoft.com/zh-tw/library/ms173077.aspx
  6. 按下 F5 以建置並執行範例程式。

?考

如需詳細資訊,請按一下下面的文章編號,檢視「Microsoft 知識庫」中的文章:
306777 如何使用 System.IO 和 Visual C# 讀取文字檔案 (機器翻譯)
注意 :本文屬於「快速發佈」文章,係由 Microsoft 技術支援或組織內部直接建立。 本文所包含的資訊是為了回應新問題而依現況提供。 因此為了迅速對外發佈,文章內容可能含有印刷錯誤,而且可能會在不另行通知的情況下進行修改。 如需其他考量事項,請參閱使用規定

屬性

文章編號: 303974 - 上次校閱: 2013年8月23日 - 版次: 1.0
這篇文章中的資訊適用於:
  • Microsoft Visual C# 2005
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2008 Express Edition
關鍵字:?
kbhowtomaster kbio KB303974
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com