我想获取目录中的所有文件,因此我使用了For Each
循环。
但我收到此错误并停止了循环。
System.UnauthorizedAccessException:'对路径的访问 'G:\ $ RECYCLE.BIN \ S-1-5-18'被拒绝。”
由于文件许可权,循环无法访问某些文件。我想绕过这些文件并移至下一个文件。
我该怎么做
Try
For Each filename As String In Directory.GetFiles(dir_path, pattern, sub_directory)
Console.WriteLine(filename.ToString)
Next filename
Catch ex As Exception
End Try
答案 0 :(得分:2)
循环无关紧要。问题是对GetFiles
的调用。无法使用递归选项来调用GetFiles
,而只能忽略无法访问的文件夹。仅当您知道可以访问每个子文件夹时,才可以使用该方法。否则,您需要编写自己的递归文件搜索并显式捕获那些异常并忽略它们。网上有很多例子。
应注意,GetFiles
首先进行整个搜索,创建一个包含所有文件路径的数组并返回它,因此,直到完成循环,您的循环才开始。即使这可行,如果要在现场遍历文件路径,通常最好还是调用EnumerateFiles
。这是因为EnumerateFiles
是一个迭代器,基本上是一个接一个地返回文件路径。这意味着,例如,如果满足特定条件而无需完成整个搜索,则可以跳出循环。尽管EnumerateFiles
仍然找不到文件夹,但仍会引发异常,因此这里无济于事。如果您确实编写了自己的方法,那么如果您打算搜索大文件夹,或者您可能不需要使用所有结果,那么最好编写一个迭代器。
编辑:
这是我的家纺版。第一个首先完成所有工作,第二个是迭代器。请注意,通过使用单个外部列表存储所有文件路径,而不是在每个递归调用中创建一个新文件,可以使第一个文件更有效率。
Public Function GetFilesRecursively(path As String, searchPattern As String) As String()
Dim filePaths As New List(Of String)(Directory.GetFiles(path, searchPattern))
For Each folderPath In Directory.GetDirectories(path)
Try
filePaths.AddRange(GetFilesRecursively(folderPath, searchPattern))
Catch ex As UnauthorizedAccessException
'Ignore inaccessible folders
End Try
Next
Return filePaths.ToArray()
End Function
Public Iterator Function EnumerateFilesRecursively(path As String, searchPattern As String) As IEnumerable(Of String)
For Each filePath In Directory.EnumerateFiles(path, searchPattern)
Yield filePath
Next
For Each folderPath In Directory.EnumerateDirectories(path)
Try
For Each filePath In EnumerateFilesRecursively(folderPath, searchPattern)
Yield filePath
Next
Catch ex As UnauthorizedAccessException
'Ignore inaccessible folders
End Try
Next
End Function