我有一个函数,它执行文件的递归目录搜索,但当我搜索驱动器时,我得到访问被拒绝错误,这将停止搜索。我该如何避免这些错误?
这是我使用的功能:
lstSearch = GetFilesRecursive(FolderBrowserDialogMain.SelectedPath)
Private Function GetFilesRecursive(ByVal path As String) As List(Of String)
Dim lstResult As New List(Of String)
Dim stkStack As New Stack(Of String)
stkStack.Push(path)
Do While (stkStack.Count > 0)
Dim strDirectory As String = stkStack.Pop
Try
lstResult.AddRange(Directory.GetFiles(strDirectory, "*.mp3"))
Dim strDirectoryName As String
For Each strDirectoryName In Directory.GetDirectories(strDirectory)
stkStack.Push(strDirectoryName)
Next
Catch ex As Exception
End Try
Loop
Return lstResult
End Function
谢谢你的解决方案。
感谢代码,它工作,但仔细看后,我发现这一行将完成这项工作:
myfiles = IO.Directory.GetFiles(strpath, "*.*", IO.SearchOption.AllDirectories)
只需将搜索选项从TopDirectoryOnly更改为AllDirectories。我总是希望使用本机功能。
您可以通过递归循环遍历文件和目录并添加一些try catch逻辑来实现此目的。
Public Class MainClass
Private Function GetAllFiles(ByVal strPath As String) As List(Of String)
Dim lst As New List(Of String)
GetFiles(strPath, lst)
Return lst
End Function
Public Sub GetFiles(ByVal strpath As String, ByRef lstfiles As List(Of String))
Try
Dim str As String() = IO.Directory.GetFiles(strpath, "*.*", IO.SearchOption.TopDirectoryOnly)
'Get Current Directory files
lstfiles.AddRange(str)
'Loop over sub-directories
For Each strDirectory As String In IO.Directory.GetDirectories(strpath, "*.*", IO.SearchOption.TopDirectoryOnly)
Me.GetFiles(strDirectory, lstfiles)
Next
Catch ex As UnauthorizedAccessException
'Access Denied exception
Catch ex1 As Exception
'Other exceptions
End Try
End Sub
End Class
我唯一改变以避免访问被拒绝的错误是使用Try / Catch进行UnauthorizedAccessException然后我只是没有处理它。当它完成搜索时,无论如何都要使用lstResult。我在BackgroundWorker中有这个代码,所以它不会弄乱UI。
Dim lstResult As New List(Of String)
Dim stkStack As New Stack(Of String)
stkStack.Push(SearchSelectedPath)
Do While (stkStack.Count > 0)
Dim strDirectory As String = stkStack.Pop
Try
lstResult.AddRange(Directory.GetFiles(strDirectory, "*.mp3"))
Dim strDirectoryName As String
For Each strDirectoryName In Directory.GetDirectories(strDirectory)
stkStack.Push(strDirectoryName)
Next
Catch ex As UnauthorizedAccessException
End Try
Loop
我在大约一分半钟内搜索了我的C / D驱动器,发现每个驱动器中有近150个MP3,没有错误。