VB.NET中的递归文件搜索

问题描述 投票:1回答: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

谢谢你的解决方案。

vb.net recursion file-search
3个回答
2
投票

感谢代码,它工作,但仔细看后,我发现这一行将完成这项工作:

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

只需将搜索选项从TopDirectoryOnly更改为AllDirectories。我总是希望使用本机功能。


0
投票

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

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,没有错误。

© www.soinside.com 2019 - 2024. All rights reserved.