2016-11-08 123 views
0

我有一個組合框,我從中選擇文件夾名稱。在我的D:\中搜索這個文件夾,並且當它們被找到時,在它中找到一個名爲「Versions」的文件夾也必須找到。然後,這個「版本」子文件夾需要在樹狀視圖中填充所有子文件夾。關於如何做到這一點的任何想法,我真的碰到了這個?!?到目前爲止我的代碼(沒有錯誤,但沒有任何反應):從Combobox.Text填充Treeview目錄

編輯的代碼(仍然沒有工作):

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

Dim folder1 As String() = Directory.GetDirectories("D:\", MyCombo.Text, System.IO.SearchOption.AllDirectories) 
    For Each folder1 As String In MyDirectory 
     Dim SubDirectories As String() = IO.Directory.GetDirectories(folder1, "*Versions*", System.IO.SearchOption.AllDirectories) 
     For Each subfolder In SubDirectories 
      PopulateFolder(subfolder) 
     Next 
    Next 
End Sub 

Private Sub PopulateFolder(folder As String) 

    tv1.Nodes(0).Text = folder 
    tv1.Nodes(0).ImageIndex = 1 
    Dim DirSep = Path.DirectorySeparatorChar 
    Dim thisFolder As String 
    Dim tn As TreeNode 

    For Each d As String In Directory.EnumerateDirectories(folder) 
      ' split the path to get the last segment 
      Dim split = d.Split(DirSep) 
      thisFolder = split(split.Length - 1) 
      tn = New TreeNode(thisFolder, 1, 1) 
      tv1.Nodes(0).Nodes.Add(tn) 
      PopulateFiles(tn, d) 
     Next 
     PopulateFiles(tv1.Nodes(0), folder) 
End Sub 

Private Sub PopulateFiles(tn As TreeNode, folder As String) 

    For Each f As String In Directory.EnumerateFiles(folder, "*.*") 
     ' Path will extract the name: 
     tn.Nodes.Add("", Path.GetFileName(f), 0) 
    Next 
End Sub 

這裏是截圖和我需要的另一種解釋:

enter image description here

因此,第一個代碼必須搜索名爲「Microsoft」的文件夾作爲組合框項目顯示。然後,在該文件夾中,對於名爲「版本」的文件夾,必須進行另一次搜索。最後,從「版本」填充所有基礎子文件夾/文件。在Treeview的「版本」之前或之後的文件夾中沒有文件夾!在這種情況下,我的「版本」路徑是「D:\ MyDocuments \ Programs \ Microsoft \ Versions \」 - 搜索路徑不同,但都位於「D:\」目錄中,全部包含「版本」文件夾。

任何幫助非常感謝,提前致謝!

+0

這是一個調試問題。代碼運行時,MyCombo.Text的價值是什麼? – LarsTech

+0

@LarsTech,MyCombo.Text的值是「Microsoft」 - 所以它應該搜索D:\中的Microsoft文件夾。搜索路徑是O.K.正如我在調試器中看到的那樣,它在「針對每個f作爲FileInfo」中進行了調查。 – LuckyLuke82

+0

代碼以其他方式發佈。 – LarsTech

回答

1

這將填充組織,因爲它們在磁盤上的文件夾和文件Treeview ...別急還有更多:

什麼,我需要顯示只是一個文件夾/文件名,

在重新編輯:該碼保持大致相同的前兩個版本,只是一些助手已劃分爲「發現」的出發點和特定的子文件夾:

Private Function FindVersionsFolder(startFolder As String) As String 
    ' find a folder named "Versions" to be used as the start point 
    ' note: can return "" when not found 
    Dim curPath As String = Path.Combine(startFolder, "Versions") 
    Dim temp As String = "" 

    If Directory.Exists(curPath) Then 
     Return curPath 
    Else 
     For Each d As String In Directory.EnumerateDirectories(startFolder) 
      temp = FindVersionsFolder(d) 
      If String.IsNullOrEmpty(temp) = False Then Return temp 
     Next 
    End If 
    Return "" 

End Function 

Private Sub PopulateFolder(folder As String, parentNode As TreeNode, 
          Optional pattern As String = "*") 
    ' create node for current folder, 
    ' add child folders 
    ' add files contained 
    Dim thisFolder As String 
    Dim tn As TreeNode 

    For Each d As String In Directory.EnumerateDirectories(folder, pattern) 
     thisFolder = GetLastFolder(d) 

     tn = New TreeNode(thisFolder, 1, 1) 
     parentNode.Nodes.Add(tn) 

     ' recurse to add child folders 
     PopulateFolder(d, tn) 
     ' populate files in this folder 
     PopulateFiles(tn, d) 
    Next 
    ' if desired the files in base "VERSIONS" folder 
    'PopulateFiles(tv1.Nodes(0), folder) 
End Sub 

Private Function GetLastFolder(fullPath As String) As String 
    ' trim to the last folder segment 
    Dim DirSep = Path.DirectorySeparatorChar 
    Dim split = fullPath.Split(DirSep) 
    Return split(split.Length - 1) 
End Function 

Private Sub PopulateFiles(tn As TreeNode, folder As String) 
    ' add all files for a folder 
    For Each f As String In Directory.EnumerateFiles(folder, "*.*") 
     tn.Nodes.Add("", Path.GetFileName(f), 0) 
    Next 
End Sub 

用法:

Dim startFolder = "C:\Temp\Microsoft" 
    ' modify root node 
    tv1.TopNode.Text = GetLastFolder(startFolder) 
    tv1.TopNode.ImageIndex = 1 

    ' find the starting point 
    startFolder = FindVersionsFolder(startFolder) 

    ' populate TV from that point 
    PopulateFolder(startFolder, tv1.Nodes(0), "Ver*") 

它增加了文件夾(如資源管理器)後啓動文件夾中。我不知道你爲什麼使用DirectoryInfo.GetFiles()) and getting a bunch of FileInfo objects if you just want the name. This uses Directory.EnumerateFiles()which is a little more efficient than GetFiles()`。

我測試的出發點有一定的障礙和文件夾/文件要排除:

enter image description here

結果似乎是你想要的。它還增加了一個圖標,這樣你就可以從文件夾中的文件說:

enter image description hereenter image description here


要獲得每個文件類型關聯的圖標,看到Show folder icon in a listview。不要讓ListView部件引發你 - 兩個控件都使用ImageList來處理圖像。

+0

謝謝,我會測試這個明天。儘管我需要顯示的只是一個文件夾/文件名,但不包括您在示例中提供的路徑。我仍然需要部分代碼來搜索我的「微軟」文件夾...但是我想我可以改變它......看起來很好用的圖標 - 這裏有個問題 - 我可以使用像Explorer這樣的文件的圖標嗎? (從.dll如果我沒有錯) – LuckyLuke82

+0

我測試了你的代碼,但我不適合我,我得到錯誤「指定的參數超出了有效值的範圍。」在「tv1.Nodes(0).Text = folder」行中。看看我編輯的問題,你會看到我提供的圖像下的另一種解釋。 – LuckyLuke82