zoukankan      html  css  js  c++  java
  • C#TreeView控件遍历文件夹下所有子文件夹以及文件

      一直对递归的理解不深刻,有时候觉得很简单,可是用起来总会出错。这里需要在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;
            }
    

      结果:

    在此记录一下,也算是小进步吧

  • 相关阅读:
    原码、反码、补码以及为什么要用反码和补码
    Linux中的段管理,bss段,data段,
    关于SRAM,DRAM,SDRAM,以及NORFLASH,NANDFLASH
    S3C2440的GPIO
    剑指offer——二叉搜索树与双向链表
    剑指offer——平衡二叉树
    ***剑指offer——字符串的排列(不会)
    剑指offer——两个链表的第一个公共结点
    剑指offer——数组中只出现一次的数字
    剑指offer——最小的K个数
  • 原文地址:https://www.cnblogs.com/HIT-LYT/p/4287413.html
Copyright © 2011-2022 走看看