递归搜索系统中的所有文件夹和子文件夹

时间:2011-03-24 08:29:52

标签: vb.net

我编写了一个Windows窗体脚本,用于搜索系统中的所有非隐藏和非读取文件夹。但是脚本本身在最初运行时运行了5分钟。随后的开放花费的时间要少得多。我想知道它是否存在逻辑错误,以至于为什么它的运行速度非常慢。

Private Function FindSubFolders(ByVal dir As DirectoryInfo, ByVal node As TreeNode) As TreeNode
    Dim subnode As New TreeNode
    For Each folder As DirectoryInfo In dir.GetDirectories()
        If (folder.Attributes And FileAttributes.Hidden) <> FileAttributes.Hidden Then
            subnode = node.Nodes.Add(folder.FullName, folder.Name)
            subnode = FindSubFolders(folder, subnode)
        End If
    Next
    Return subnode
End Function

Private Sub SetFolders_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    'Is it possible to load this on 1st (initial) form load???

    Try
        Dim node As TreeNode
        If TreeView1.Nodes.Count < 1 Then
            For Each drive As String In Directory.GetLogicalDrives
                Directory.GetLogicalDrives()
                Dim folders As DirectoryInfo = New DirectoryInfo(drive)
                If (folders.Attributes And FileAttributes.ReadOnly) <> FileAttributes.ReadOnly Then
                    node = TreeView1.Nodes.Add(drive, drive)
                    Try
                        node = FindSubFolders(folders, node)
                    Catch ex As Exception
                        Console.WriteLine(ex.Message)
                        Continue For
                    End Try
                End If
            Next
        End If
        If Not IsNothing(My.Settings.Folders) Then
            If ListBox1.Items.Count < 1 Then
                For Each col As String In My.Settings.Folders
                    ListBox1.Items.Add(col)
                Next
            End If
        Else
            My.Settings.Folders = New StringCollection
        End If
    Catch ex As Exception
        Logs.Add("04", ex.Message)
    End Try
    Logs.Add("01", "Loaded.")
End Sub

感谢您的帮助! :)

1 个答案:

答案 0 :(得分:1)

以下是一些提示:

您可以做的一件事就是确保每次向其添加项目时TreeView控件都不必重绘自身。 在添加任何项目之前,请运行 Treeview1.BeginUpdate ,并在添加完所有项目后运行 Treeview1.EndUpdate

如果可能,将目录作为数组获取,并使用node.addrange一次添加一系列directiry。

来自MSDN:

  

保持物品的性能   每次添加一个   TreeView,调用BeginUpdate方法。   BeginUpdate方法阻止了   从绘画到控制   调用EndUpdate方法。该   将项添加到树的首选方法   视图控件是使用AddRange   添加树节点数组的方法   项目到树视图。但是,如果你   想要一次添加一个项目,请使用   BeginUpdate方法来防止   从绘画期间的TreeView控件   添加操作。允许的   控制恢复绘画,打电话给   所有树时的EndUpdate方法   节点已添加到树中   图。

查看此问题以获取(可能)更简单的方法来获取子文件夹:
Get all folder / directories list in VB.net