【问题标题】:Recursive File Search in VB.NETVB.NET 中的递归文件搜索
【发布时间】:2017-05-22 02:05:33
【问题描述】:

我有一个函数可以对文件进行递归目录搜索,但是当我搜索驱动器时,我收到拒绝访问的错误,这会停止搜索。如何避免这些错误?

这是我使用的函数:

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?
  • Catch ex As Exception 捕获异常但不采取任何措施有什么意义?
  • Xaquon,我认为如果没有发现任何错误,它将继续在搜索中运行。
  • Zaggler,我看到了一个关于递归的例子并使用了代码。它适用于除驱动器之外的所有设备。
  • 那里没有递归。递归要求方法直接或间接调用自身,而这并没有发生。你需要对递归做更多的研究。

标签: vb.net recursion file-search


【解决方案1】:

感谢您的代码,它有效,但仔细查看后,我发现这一行就可以完成这项工作:

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

只需将搜索选项从 TopDirectoryOnly 更改为 AllDirectories。我总是希望使用原生函数。

【讨论】:

  • 包含受保护目录时的错误除外
【解决方案2】:

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

【讨论】:

  • 这是该问题的最佳答案。
【解决方案3】:

为了避免 Access Denied 错误,我所做的唯一更改是对 UnauthorizedAccessException 使用 Try/Catch,然后我就没有处理它。完成搜索后,无论如何都可以使用 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 没有错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-24
    • 2012-06-15
    • 2014-12-09
    • 2012-04-07
    • 1970-01-01
    • 2014-10-27
    • 1970-01-01
    相关资源
    最近更新 更多