VB.NET中的递归文件搜索

3

我有一个函数用于递归搜索文件目录,但当我搜索驱动器时,会出现访问被拒绝的错误,导致搜索停止。该如何避免这些错误?

以下是我使用的函数:

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

感谢任何解决方案。

为什么要使用 Stack - Trevor
捕获异常(Catch ex As Exception)的目的是什么?即使什么也不做,为什么要捕获异常? - Xaqron
Xaquon,我以为不捕获任何错误它会继续运行搜索。 - NPS
3
那里没有递归。递归需要一个方法直接或间接地调用自身,但这里没有发生。你需要更深入地研究递归。 - jmcilhinney
由于出现“访问被拒绝”错误,您是否确保在搜索文件的位置具有适当的访问权限?您是否尝试以管理员身份运行应用程序/解决方案? - Malcolm Salvador
显示剩余2条评论
3个回答

8

感谢您提供的代码,它有效了。但在仔细查看后,我发现单独这一行就可以完成任务:

myfiles = IO.Directory.GetFiles(strpath, "*.*", IO.SearchOption.AllDirectories)

只需将搜索选项从TopDirectoryOnly更改为AllDirectories即可。我总是尽量使用本地函数。


除了在包含受保护目录时出现错误外,返回已翻译的文本。 - John

1
你可以通过循环递归文件和目录并添加一些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

1
这是对问题的最佳答案。 - John

0
我为了避免“访问被拒绝”错误所做的唯一更改是使用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文件,没有出现任何错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接