如何使用 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命名空間中的類別提供物件導向的方式來存取檔案和目錄。

需求

下列清單概述了建議的硬體、 軟體、 網路基礎結構,以及您所需要的 service pack:

  • 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方法可讓您擷取的字串陣列,符合特定準則的檔案。下列程式碼範例會使用檔案物件來擷取所有 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 Form 專案。如果表單名為 Form1,代表表單的兩個檔案會命名為 「 Form1.vb 」 和 「 Form1.Designer.vb 」。您可以撰寫程式碼 Form1.vb 檔案中。Windows Form 設計工具在寫程式碼在 Form1.Designer.vb 檔案中。Windows Form 設計工具會使用部分關鍵字,分成兩個不同的檔案中的 Form1 的實作。這種行為可防止設計工具產生的程式碼與您的程式碼位置顛倒。

    如需有關新的 Visual Basic 2005年程式語言加強功能的詳細資訊,請造訪下列 Microsoft 開發人員網路 (MSDN) 網站︰

    如需有關部分類別和 Windows Form 設計工具的詳細資訊,請造訪下列 MSDN 網站︰

  6. 請按 F5 以建置並執行範例。

參考

如需詳細資訊,按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

如何使用 System.IO,Visual Basic 2005年中,或在 Visual Basic.NET 中讀取文字檔案

多個一般 Visual Basic.NET 的詳細資訊,請參閱下列的 Usenet 新聞群組︰

Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Insiders

Was this information helpful?

Thank you for your feedback!

Thank you for your feedback! It sounds like it might be helpful to connect you to one of our Office support agents.

×