开发者

Recursive search for all folders and subfolders in system

I wrote a Windows Forms script that searched for all non-hidden and non-readonly folders in my system. But the script itself, when run initially, runs for like 5 minutes. Subsequent opens take much less time. I was wondering if there is a logical error to it, so as to why its running so very slow.

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(开发者_StackOverflowdrive)
                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

Thanks for the help! :)


Here are a few tips:

One thing you can do to speed things up is to make sure the TreeView-control does not have to repaint itself every time you add an item to it. Before adding any item, run Treeview1.BeginUpdate and after you have added all items run Treeview1.EndUpdate

If possible, get the directories as an array, and use the node.addrange to add a whole range of directiryes at once.

From MSDN:

To maintain performance while items are added one at a time to the TreeView, call the BeginUpdate method. The BeginUpdate method prevents the control from painting until the EndUpdate method is called. The preferred way to add items to a tree view control is to use the AddRange method to add an array of tree node items to a tree view. However, if you want to add items one at a time, use the BeginUpdate method to prevent the TreeView control from painting during the add operations. To allow the control to resume painting, call the EndUpdate method when all the tree nodes have been added to the tree view.

Check out this question for a (maybe) more easy way to fetch the subfolders:
Get all folder / directories list in VB.net

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜