16,554
社区成员
发帖
与我相关
我的任务
分享
' <summary>
' Recurses the given path, adding all files on that path to
' the list box. After it finishes with the files, it
' calls itself once for each directory on the path.
' </summary>
' <param name="searchPath"></param>
Private Sub RecurseDirectory(searchPath As String)
' Split searchPath into a directory and a wildcard specification.
'
Dim directoryPath As String = Path.GetDirectoryName(searchPath)
Dim search As String = Path.GetFileName(searchPath)
' If a directory or search criteria are not specified, then return.
'
If directoryPath Is Nothing Or search Is Nothing Then
Return
End If
Dim files() As String
' File systems like NTFS that have
' access permissions might result in exceptions
' when looking into directories without permission.
' Catch those exceptions and return.
Try
files = Directory.GetFiles(directoryPath, search)
Catch e As UnauthorizedAccessException
Return
Catch e As DirectoryNotFoundException
Return
End Try
' Perform a BeginInvoke call to the list box
' in order to marshal to the correct thread. It is not
' very efficient to perform this marshal once for every
' file, so batch up multiple file calls into one
' marshal invocation.
Dim startingIndex As Integer = 0
While startingIndex < files.Length
' Batch up 20 files at once, unless at the
' end.
'
Dim count As Integer = 20
If count + startingIndex >= files.Length Then
count = files.Length - startingIndex
End If
' Begin the cross-thread call. Because you are passing
' immutable objects into this invoke method, you do not have to
' wait for it to finish. If these were complex objects, you would
' have to either create new instances of them or
' wait for the thread to process this invoke before modifying
' the objects.
Dim r As IAsyncResult = BeginInvoke(_fileListDelegate, New Object() {files, startingIndex, count})
startingIndex += count
End While
' Now that you have finished the files in this directory, recurse
' for each subdirectory.
Dim directories As String() = Directory.GetDirectories(directoryPath)
Dim d As String
For Each d In directories
RecurseDirectory(Path.Combine(d, search))
Next d
End Sub