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

文章翻译 文章翻译
文章编号: 303974 - 查看本文应用于的产品
本文的发布号曾为 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) 网站:
    http://msdn.microsoft.com/zh-cn/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 标准版
  • 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