2011-03-24 149 views
1

我編寫了一個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 

感謝您的幫助! :)

+0

檢查這個線程:http://stackoverflow.com/questions/2428136/get-all-folder -directories-list-in-vb-net – Stefan 2011-03-24 08:35:58

+0

做某種*基準測試*可能有助於確定何時完全丟失時間。 System.Diagnostics.Stopwatch類可用於此目的。 – Heinzi 2011-03-24 08:48:18

回答

1

這裏有幾個技巧:

有一件事可以做,以加快速度是確保TreeView的控制沒有每次項目添加到它的時候給自己重繪。 之前添加任何項目,運行Treeview1.BeginUpdate和您添加後的所有項目運行Treeview1.EndUpdate

如果可能的話,得到的目錄作爲一個數組,並使用node.addrange來一次添加一系列directiryes。

從MSDN:

爲了保持性能的同時 在每次向 TreeView中增加了一個項目,叫的BeginUpdate方法。 BeginUpdate方法阻止 控件進行繪製,直到調用 EndUpdate方法。 將項目添加到樹視圖控件的首選方法是使用AddRange 方法將樹節點 項的數組添加到樹視圖。但是,如果您想要逐個添加項目,請使用 BeginUpdate方法來防止 TreeView控件在 的繪製期間進行添加操作。要允許 控件繼續繪製,請在所有樹 節點已添加到樹 視圖中時調用 EndUpdate方法。

退房這個問題了(可能)更簡單的方法來獲取子文件夾:
Get all folder/directories list in VB.net

+0

謝謝!這爲我解決:) – demijnzia 2011-06-20 06:33:02

相關問題