2013-08-06 72 views
1

我正在尋找最簡單的方式來顯示樹狀視圖中的所有驅動器,文件和子文件夾。如果有人有一段代碼來做到這一點,他們不介意分享,我會很感激。顯示樹狀視圖中的所有驅動器,文件和子文件夾

我已經得到了這個代碼,我嘗試使用,但它給了我一個「IOException異常是未處理的」錯誤說「該設備未準備好。」最近下面

Dim folders() As String = IO.Directory.GetDirectories(dir) 

線運行時錯誤(後約5-10秒)下面是代碼的其餘部分

Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim drives As System.Collections.ObjectModel.ReadOnlyCollection(Of IO.DriveInfo) = My.Computer.FileSystem.Drives 
    Dim rootDir As String = String.Empty 
    For i As Integer = 0 To drives.Count - 1 
     rootDir = drives(i).Name 
     TreeView1.Nodes.Add(rootDir) 
     PopulateTreeView(rootDir, TreeView1.Nodes(i)) 
    Next 
End Sub 

Private Sub PopulateTreeView(ByVal dir As String, ByVal parentNode As TreeNode) 
    Dim folder As String = String.Empty 
    Try 
     Dim folders() As String = IO.Directory.GetDirectories(dir) 
     If folders.Length <> 0 Then 
      Dim childNode As TreeNode = Nothing 
      For Each folder In folders 
       childNode = New TreeNode(folder) 
       parentNode.Nodes.Add(childNode) 
       PopulateTreeView(folder, childNode) 
      Next 
     End If 
    Catch ex As UnauthorizedAccessException 
     parentNode.Nodes.Add(folder & ": Access Denied") 
    End Try 
End Sub 
+3

你能告訴我們你試過了什麼,它失敗了嗎?最好先提供一些東西。人們不會只寫你的代碼。 – Kenneth

+0

當然遞歸函數的工作,但如果根拾起這將是緩慢的。 – OneFineDay

+0

你也應該使用EnumerateDirectories而不是GetDirectories因爲你可以開始列舉的結果中返回的所有數據之前。使用GetDirectories,您必須等待通話完成。 –

回答

1

好像你有了一個良好的開端。您收到的IOException很可能是你的程序試圖列出一個空的光盤驅動器,這顯然是不可能的內容而引起的。

修復的方法是簡單的:

For i As Integer = 0 To drives.Count - 1 
    If Not drives(i).IsReady Then 
     Continue For 
    End If 
    rootDir = drives(i).Name 
    TreeView1.Nodes.Add(rootDir) 
    PopulateTreeView(rootDir, TreeView1.Nodes(i)) 
Next 

除此之外,一個節點被點擊,直到我建議不加載文件夾的內容。將遞歸調用限制爲1級(當前目錄+其所有子目錄的內容)。這樣,您可以獲得最佳性能,同時仍然可以確定子目錄是否應該具有樹視圖展開按鈕。

相關問題