簡體   English   中英

遞歸計數文件夾和子文件夾(包括根VB.NET)中的文件

[英]Recursively Counting Files in Folders and Subfolders Including Root VB.NET

我正在嘗試計算CDROM驅動器F:\\的文件夾和子文件夾中的文件總數,CDROM上的文件總數為58,但下面的代碼返回的文件總數為39。所有計數的39個文件都包含在文件夾和缺少的19個文件位於驅動器F:\\的根目錄中

如何計算根目錄中的文件以及文件夾\\子文件夾?

我正在使用遞歸搜索,因為我發現它比Try.Catch異常錯誤更有效,而不是IO.Directory.EnumerateFiles(DirectoryPath,“ *”,IO.SearchOption.AllDirectories).Count等。

問候

喬治

Public Sub Search1()

    Dim DirectoryPath = TextBox1.Text
    Dim TotalFileCount As Long = 0

    Search2(DirectoryPath, TotalFileCount)
    MsgBox(TotalFileCount)

End Sub

Public Sub Search2(ByVal DirectoryPath As String, ByRef TotalFileCount As Integer)

    Dim FileName As String = Nothing

    Try
        For Each Directory In IO.Directory.GetDirectories(DirectoryPath)
            For Each File In IO.Directory.GetFiles(Directory, "*")
                FileName = New IO.FileInfo(File).FullName
                TotalFileCount += 1
            Next
            Search2(Directory, TotalFileCount)
        Next
    Catch ua As UnauthorizedAccessException
        ListBox1.Items.Add("Exception: " & ua.Message & " " & FileName)
    Catch ex As Exception
        ListBox1.Items.Add("Exception: " & ex.Message & " " & FileName)
    End Try
End Sub

在Search2方法中,您應該在目錄的foreach循環之外找到文件。 您的方法是在這些文件夾中查找子文件夾和文件,而不在當前文件夾中查找文件。

嘗試這個

Public Sub Search2(ByVal DirectoryPath As String, ByRef TotalFileCount As Integer)
    Dim FileName As String = Nothing
    Try
        For Each Directory In IO.Directory.GetDirectories(DirectoryPath)
            Search2(Directory, TotalFileCount)
        Next
        For Each File In IO.Directory.GetFiles(DirectoryPath, "*")
            FileName = New IO.FileInfo(File).FullName
            TotalFileCount += 1
        Next
    Catch ua As UnauthorizedAccessException
        ListBox1.Items.Add("Exception: " & ua.Message & " " & FileName)
    Catch ex As Exception
        ListBox1.Items.Add("Exception: " & ex.Message & " " & FileName)
    End Try
End Sub

另外,我認為,如果您僅返回文件數(使用函數而不是sub和ByRef參數)並求和該值以得出總數,那將很容易理解。

這是一種嘗試的方法

Public Function FileCount(DirPath As String, Optional IncludeSubDirs As Boolean = True) As Long
    Dim rv As Long = 0L
    Try
        If IncludeSubDirs Then
            For Each dirname As String In IO.Directory.GetDirectories(DirPath)
                rv += FileCount(dirname, IncludeSubDirs)
            Next
            rv += IO.Directory.GetFiles(DirPath).Length
        End If
    Catch ua As UnauthorizedAccessException
        'Stop
    Catch ex As Exception
        'Stop
    End Try
    Return rv
End Function

經過測試

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim DirectoryPath As String = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
    Dim stpw As Stopwatch = Stopwatch.StartNew

    Dim TotalFileCount As Long = FileCount(DirectoryPath)

    stpw.Stop()
    Dim rslts As String = String.Format("Total Files = {0:n0}.  Took {1:n0} ms.", TotalFileCount, stpw.ElapsedMilliseconds)
    Debug.WriteLine(rslts)
End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM