一直对递归的理解不深刻,有时候觉得很简单,可是用起来总会出错。这里需要在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;
}
结果:
在此记录一下,也算是小进步吧