標籤:
一直對遞迴的理解不深刻,有時候覺得很簡單,可是用起來總會出錯。這裡需要在TreeView控制項裡顯示一個檔案夾下的所有目錄以及檔案,毫無意外的需要用到遞迴。
一開始,想到用遞迴寫一個產生每一個節點(TreeNode)的方法,最後將根結點添加到TreeView中即可。
1 private static TreeNode getRootNode(string dirname)//根據傳入的檔案夾地址,遍曆所有的子目錄和檔案並產生節點 2 { 3 TreeNode node = new TreeNode(dirname); 4 string[] dirs = Directory.GetDirectories(dirname); 5 string[] files = Directory.GetFiles(dirname); 6 7 foreach (string dir in dirs) 8 { 9 node.Nodes.Add(dir);10 getRootNode(dir);11 }12 13 14 foreach (string file in files)15 {16 17 TreeNode fnode = new TreeNode(file);18 node.Nodes.Add(fnode);19 20 }21 22 return node;23 }
結果並不如我想的那樣,它只是把根目錄下的所有目錄遍曆並且產生了根結點的子節點而已。結果如下:
只有根結點和一級子節點,子目錄下的檔案和二級子目錄都沒了。關鍵在紅色的代碼部分,這裡我遞迴了,但是卻並沒有將產生的子節點加到上一級節點。
關鍵還是對遞迴的理解太膚淺了。
下面是改正過得代碼和結果:
public static Boolean createTree(TreeView tree,string dirname) { TreeNode root; if ((root=getRootNode(dirname)) == null) return false; tree.Nodes.Add(root); return true; } private static TreeNode getRootNode(string dirname)//遞迴,返回根結點 { TreeNode node = new TreeNode(dirname); string[] dirs = Directory.GetDirectories(dirname); string[] files = Directory.GetFiles(dirname); foreach (string dir in dirs) { node.Nodes.Add(getRootNode(dir)); } foreach (string file in files) { if (Path.GetExtension(file) == ".c" || Path.GetExtension(file) == ".h") { TreeNode fnode = new TreeNode(file); node.Nodes.Add(fnode); } } return node; }
結果:
在此記錄一下,也算是小進步吧
C#TreeView控制項遍曆檔案夾下所有子檔案夾以及檔案