[英]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.