如何遍历文件并跳过那些我无权访问的文件

时间:2019-10-30 06:56:33

标签: vb.net

我想获取目录中的所有文件,因此我使用了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

1 个答案:

答案 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