如何通过使用 Visual Basic 2005年或 Visual Basic.NET 以递归方式搜索目录

这篇文章的 Microsoft Visual C++ 2005年和 Microsoft Visual C++.NET 版本,请参见

这篇文章的 Microsoft Visual C# 2005年和 Microsoft Visual C#.NET 版本,请参见

概要

本文通过代码演示如何从根目录开始的文件以递归方式搜索子目录。指定搜索字符串,因此您可以搜索与特定条件匹配的文件。代码的每个部分将根据需要进行说明。在文章的末尾还提供了工作代码示例。

常见的 IO 任务对于开发人员来说,目录递归是。FileSystemObject方便此任务的组件对象模型 (COM) 应用程序。现在此任务变得更加容易在 Microsoft.NET Framework 中。类似于FileSystemObject, System.IO命名空间中的类提供了面向对象的方法来访问的文件和目录。

要求

下面的列表列出了推荐使用的硬件、 软件、 网络基础结构和所需的服务包︰

  • Microsoft Visual Studio 2005年或 Microsoft Visual Studio.NET

Microsoft 提供的编程示例仅用于说明,没有任何明示或暗示的担保。这包括但不限于适销性或特定用途适用性的暗示担保。本文假定您熟悉所演示的编程语言和用于创建和调试过程的工具。Microsoft 的支持工程师可以帮助解释某个特定过程的功能,但是他们不会修改这些示例以提供额外的功能或构建过程以满足您的特定要求。

目录递归

文件和目录操作类驻留在System.IO命名空间中。在使用这些类之前,应该将以下命名空间导入您的项目。

using System.IO;

System.IO命名空间的类提供了许多用于处理文件和目录的选项。System.IO名称空间不仅提供可以实例化的类,而且还提供文件和目录实用工具类。这些类包含共享的方法,可以调用无需声明该类型的一个变量。例如,目录对象可用于获取给定目录的子目录。

下面的代码使用的目录对象的共享的GetDirectories方法返回的字符串数组。如果有的话,该数组包含到 C:\ 目录的子目录的目录路径名。

Dim directories() As String = Directory.GetDirectories("C:\")

目录对象还包含GetFiles方法。GetFiles方法可以检索与特定条件匹配的文件的字符串数组。下面的代码示例使用File对象检索所有 C:\ 目录中具有.dll 扩展名结尾的文件。

Dim files() As String = Directory.GetFiles("C:\", "*.dll")

GetDirectories方法和目录对象的GetFiles方法将以递归方式搜索与搜索字符串匹配的文件的所有需要。以下方法用于执行递归。

    Sub DirSearch(ByVal sDir As String)        Dim d As String
Dim f As String

Try
For Each d In Directory.GetDirectories(sDir)
For Each f In Directory.GetFiles(d, txtFile.Text)
lstFilesFound.Items.Add(f)
Next
DirSearch(d)
Next
Catch excpt As System.Exception
Debug.WriteLine(excpt.Message)
End Try
End Sub

前面的代码中传递一个字符串,其中包含您要搜索到DirSearch目录。此字符串值是目录的完整路径名称。GetDirectories方法可用于检索到您的过程的传递的目录的子目录。由于GetDirectories方法返回一个数组,您可以使用为/每个语句循环访问每个子目录中。对于每个子目录中,使用GetFiles方法来循环访问该目录中的文件。在窗体上的文本框的值传递给GetFiles方法中。文本框中包含筛选器的GetFiles方法返回的结果的搜索字符串。如果任何文件与搜索条件相匹配,将它们添加到列表框。位于每个子目录,再次调用DirSearch并向它传递一个子目录。通过使用此递归调用,您可以搜索给定的根目录的所有子目录。

完整代码示例

  1. 启动新的 Microsoft Visual Basic 2005年或 Microsoft Visual Basic.NET Windows 应用程序项目。默认情况下,创建一个名为 Form1 的窗体。

  2. 在视图菜单上单击以显示解决方案资源管理器。

  3. 在解决方案资源管理器中,右键单击Form1,,然后单击查看代码。

  4. 在 Form1 的代码窗口中,突出显示,然后删除所有现有的代码。

  5. Form1 窗体的代码窗口中粘贴下面的代码。

    Imports System.IO
    Public Class Form1
    Inherits System.Windows.Forms.Form

    #Region " Windows Form Designer generated code "

    Public Sub New()
    MyBase.New()

    'This call is required by the Windows Form Designer.
    InitializeComponent()

    'Add any initialization after the InitializeComponent() call.

    End Sub

    'Form overrides dispose to clean up the component list.
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
    If disposing Then
    If Not (components Is Nothing) Then
    components.Dispose()
    End If
    End If
    MyBase.Dispose(disposing)
    End Sub
    Friend WithEvents cboDirectory As System.Windows.Forms.ComboBox
    Friend WithEvents txtFile As System.Windows.Forms.TextBox
    Friend WithEvents lstFilesFound As System.Windows.Forms.ListBox
    Friend WithEvents lblDirectory As System.Windows.Forms.Label
    Friend WithEvents lblFile As System.Windows.Forms.Label
    Friend WithEvents btnSearch As System.Windows.Forms.Button
    Private components As System.ComponentModel.IContainer

    'NOTE: The following procedure is required by the Windows Form Designer.
    'You can use the Windows Form Designer to modify it; however, do not
    'use the code editor to modify it.
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
    Me.btnSearch = New System.Windows.Forms.Button()
    Me.lblFile = New System.Windows.Forms.Label()
    Me.cboDirectory = New System.Windows.Forms.ComboBox()
    Me.txtFile = New System.Windows.Forms.TextBox()
    Me.lstFilesFound = New System.Windows.Forms.ListBox()
    Me.lblDirectory = New System.Windows.Forms.Label()
    Me.SuspendLayout()
    '
    'btnSearch
    '
    Me.btnSearch.Location = New System.Drawing.Point(608, 248)
    Me.btnSearch.Name = "btnSearch"
    Me.btnSearch.TabIndex = 0
    Me.btnSearch.Text = "Search"
    '
    'lblFile
    '
    Me.lblFile.Location = New System.Drawing.Point(8, 16)
    Me.lblFile.Name = "lblFile"
    Me.lblFile.Size = New System.Drawing.Size(144, 16)
    Me.lblFile.TabIndex = 5
    Me.lblFile.Text = "Search for files containing:"
    '
    'cboDirectory
    '
    Me.cboDirectory.DropDownWidth = 112
    Me.cboDirectory.Location = New System.Drawing.Point(8, 128)
    Me.cboDirectory.Name = "cboDirectory"
    Me.cboDirectory.Size = New System.Drawing.Size(120, 21)
    Me.cboDirectory.TabIndex = 2
    Me.cboDirectory.Text = "ComboBox1"
    '
    'txtFile
    '
    Me.txtFile.Location = New System.Drawing.Point(8, 40)
    Me.txtFile.Name = "txtFile"
    Me.txtFile.Size = New System.Drawing.Size(120, 20)
    Me.txtFile.TabIndex = 4
    Me.txtFile.Text = "*.dll"
    '
    'lstFilesFound
    '
    Me.lstFilesFound.Location = New System.Drawing.Point(152, 8)
    Me.lstFilesFound.Name = "lstFilesFound"
    Me.lstFilesFound.Size = New System.Drawing.Size(528, 225)
    Me.lstFilesFound.TabIndex = 1
    '
    'lblDirectory
    '
    Me.lblDirectory.Location = New System.Drawing.Point(8, 96)
    Me.lblDirectory.Name = "lblDirectory"
    Me.lblDirectory.Size = New System.Drawing.Size(120, 23)
    Me.lblDirectory.TabIndex = 3
    Me.lblDirectory.Text = "Look In:"
    '
    'Form1
    '
    Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
    Me.ClientSize = New System.Drawing.Size(688, 273)
    Me.Controls.AddRange(New System.Windows.Forms.Control() _
    {Me.lblFile, Me.txtFile, Me.lblDirectory, Me.cboDirectory, _
    Me.lstFilesFound, Me.btnSearch})
    Me.Name = "Form1"
    Me.Text = "Form1"
    Me.ResumeLayout(False)

    End Sub

    #End Region

    Private Sub btnSearch_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles btnSearch.Click
    lstFilesFound.Items.Clear()
    txtFile.Enabled = False
    cboDirectory.Enabled = False
    btnSearch.Text = "Searching..."
    Me.Cursor = Cursors.WaitCursor
    Application.DoEvents()
    DirSearch(cboDirectory.Text)
    btnSearch.Text = "Search"
    Me.Cursor = Cursors.Default
    txtFile.Enabled = True
    cboDirectory.Enabled = True
    End Sub

    Sub DirSearch(ByVal sDir As String)
    Dim d As String
    Dim f As String

    Try
    For Each d In Directory.GetDirectories(sDir)
    For Each f In Directory.GetFiles(d, txtFile.Text)
    lstFilesFound.Items.Add(f)
    Next
    DirSearch(d)
    Next
    Catch excpt As System.Exception
    Debug.WriteLine(excpt.Message)
    End Try
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
    Dim s As String
    cboDirectory.Items.Clear()
    For Each s In Directory.GetLogicalDrives()
    cboDirectory.Items.Add(s)
    Next
    cboDirectory.Text = "C:\"
    End Sub
    End Class

    注意:您必须更改在 Visual Basic 2005年中的代码。默认情况下,Visual Basic 创建两个文件为项目创建一个 Windows 窗体项目。如果窗体名为 Form1,两个文件表示形式称为 Form1.vb 和 Form1.Designer.vb。您 Form1.vb 文件中编写的代码。Windows 窗体设计器在 Form1.Designer.vb 文件中写入代码。Windows 窗体设计器使用 partial 关键字将 Form1 的实现划分为两个单独的文件。此行为可防止由设计器生成的代码与您的代码散乱分布。

    有关新的 Visual Basic 2005年语言增强功能的详细信息,请访问下面的 Microsoft 开发人员网络 (MSDN) Web 站点︰

    有关分部类和 Windows 窗体设计器的详细信息,请访问下面的 MSDN 网站︰

  6. 按 f5 键以生成并运行该示例。

参考资料

有关详细信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:

如何使用 System.IO Visual Basic 2005年中或在 Visual Basic.NET 中读取文本文件

Visual Basic.NET 有关的详细信息,请参阅下面的 Usenet 新闻组︰

需要更多帮助?

扩展你的技能
了解培训
抢先获得新功能
加入 Microsoft 内部人员

此信息是否有帮助?

谢谢您的反馈意见!

谢谢你的反馈! 可能需要转接到 Office 支持专员。

×