你目前正处于脱机状态,正在等待 Internet 重新连接

如何使用 Visual C# 递归搜索目录

本文的发布号曾为 CHS303974
有关本文的 Microsoft Visual C++ .NET 版本,请参见 307009.
有关本文的 Microsoft Visual Basic .NET 版本,请参见 306666.

本文引用下面的 Microsoft .NET Framework 类库命名空间:
  • System.IO
概要
本文分步显示如何在 C# Windows 窗体应用程序中递归搜索文件子目录。 指定了一个搜索字符串,以便搜索与某种通配符条件相匹配的文件。 根据需要对代码的每个部分进行了解释。 在文章的结尾还提供了一个工作代码示例。

对于开发人员来说,目录递归是一项常见的 IO 任务。 对于组件对象模型 (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 对象的 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 返回一个数组,所以可以使用 for/each 语句来迭代每个子目录。 对于每个子目录,请使用 GetFiles 方法迭代该目录中的文件。 窗体上文本框的值被传递到 GetFiles 中。 文本框包含筛选 GetFiles 返回结果所用的搜索字符串。 如果任何文件与搜索条件相匹配,则将它们添加到列表框中。 对于每个找到的子目录,再次调用 DirSearch,并给它传递一个子目录。 通过使用这些递归调用,您可以搜索给定根目录的所有子目录。

完整代码示例

  1. 启动新的 Visual C# Windows 应用程序项目。 默认情况下,创建一个名为 Form1 的表单。
  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 版本中,Visual C# 会在创建一个 Windows 窗体项目时向该项目添加一个窗体。 该窗体被命名为 Form1。 在 Visual C# 2005 及更高版本中,代表窗体的两个文件名为 Form1.cs 和 Form1.designer.cs。将代码写入 Form1.cs 文件。 Windows Forms Designer 将代码写入 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; using 语句添加到 Form1.cs 文件中。
    有关 Windows 窗体设计器的更多信息,请访问下面的 Microsoft Developer Network (MSDN) 网站:
  6. 按 F5 生成并运行该示例程序。
参考
有关更多信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
306777 如何使用 System.IO 和 Visual C# 读取文本文件
注意:本篇“快速发布”文章是从 Microsoft 支持组织直接创建的。 文中包含的信息按原样提供,用于响应紧急问题。 由于发布仓促,材料可能包含印刷错误,并且可能随时修订,恕不另行通知。 有关其他注意事项,请参阅使用条款
属性

文章 ID:303974 - 上次审阅时间:08/23/2013 14:37:00 - 修订版本: 1.0

Microsoft Visual C# 2005, Microsoft Visual C# .NET 2002 标准版, Microsoft Visual C# 2008 Express Edition

  • kbhowtomaster kbio KB303974
反馈