none
Winfrom 递归遍历文件和文件夹绑定Treeview问题 RRS feed

  • 问题

  • 写了一个递归方法,目的把指定文件夹下面所有文件和文件夹绑定在Treeview上,但是运行没有到达预期效果。遍历出来层次效果也不对,请执教下

     

     public static void ListTreeShow(DirectoryInfo theDir, TreeView tnParents)
    
      {
    
       try
    
       {
    
        DirectoryInfo[] subDirectories = theDir.GetDirectories();//获得目录
    
        foreach (DirectoryInfo dirInfo in subDirectories)
    
        {
    
         TreeNode tn = new TreeNode();
    
         tn.Text = dirInfo.Name;
    
         tnParents.Nodes.Add(tn);
    
         FileInfo[] fileInfo = dirInfo.GetFiles();
    
    
    
         tn.Nodes.Clear();
    
          foreach (FileInfo fInfo in fileInfo)
    
          {
    
           TreeNode tnChildNodes = new TreeNode();
    
           tnChildNodes.Nodes.Add(fInfo.Name);
    
           tn.Nodes.Add(tnChildNodes);
    
          }
    
         ListTreeShow(dirInfo,tnParents);
    
        }
    
       }
    
       catch (UnauthorizedAccessException ex)
    
       { }
    
       catch (IOException e)
    
       {
    
        throw new Exception(e.ToString());
    
       }
    
      }
           
    //窗体按钮调用方法
     private void button1_Click(object sender, EventArgs e)
        {
          if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
          {
            DirectoryInfo dtInfo = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
            FileTreePlugIn.ListTreeShow(dtInfo, treeView1);
          }
        }
    
    2010年7月22日 9:56

答案

  •     private void PopulateTreeView()
        {
    
          TreeNode rootNode;
    
          DirectoryInfo info = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
    
          if (info.Exists)
          {
            rootNode = new TreeNode(info.Name);
            rootNode.Tag = info;
            GetDirectories(info, rootNode);
            treeView1.Nodes.Add(rootNode);
    
          }
        }
    
    
        private void GetDirectories(DirectoryInfo root, TreeNode parentNode)
        {
    
          FileInfo[] files = root.GetFiles();
          for (int i = 0; i < files.Length; i++)
          {
            TreeNode filenode = new TreeNode();
            filenode.Text = files[i].Name;
            parentNode.Nodes.Add(filenode);
          }
    
          DirectoryInfo[] subroot = root.GetDirectories();
          for (int j = 0; j < subroot.Length; j++)
          {
            TreeNode directory = new TreeNode();
            directory.Text = subroot[j].Name;
            parentNode.Nodes.Add(directory);
    
            FileInfo[] fileInSub = subroot[j].GetFiles();
            GetDirectories(subroot[j], directory);
    
          }
    
        }
    
    
        private void button1_Click(object sender, EventArgs e)
        {
          if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
          {
            PopulateTreeView();
          }
        }
    


    If this is helpful
      { Please Mark as Answered }
    else if it is not helpful
      { Un-Mark as Answered }


    Best Regards
    Huan Li, Code Blog: Small is New Big In C#
    • 已标记为答案 极度 2010年7月23日 1:25
    2010年7月22日 13:09
  • 你好!

        你的漏洞在这里

    DirectoryInfo[] subDirectories = theDir.GetDirectories();//你只遍历了theDir下的所有目录,并没有遍历
    theDir下的文件,实际上theDir下可能也有文件
    foreach (DirectoryInfo dirInfo in subDirectories)



    周雪峰
    • 已标记为答案 极度 2010年7月23日 1:25
    2010年7月22日 13:10
    版主
  • 改了一下,但缺点是:列出后,文件在上面、目录在下面,与资源管理器顺序不一样。递归造成的。

            public static void ListTreeShow(DirectoryInfo theDir, TreeNode tnParents)
            {
                DirectoryInfo[] subDirectories = theDir.GetDirectories();
                foreach (DirectoryInfo dirInfo in subDirectories)
                {
                    TreeNode tn = new TreeNode();
                    tn.Text = dirInfo.Name;
                    tnParents.Nodes.Add(tn);
                    FileInfo[] fileInfo = dirInfo.GetFiles();
                    foreach (FileInfo fInfo in fileInfo)
                    {
                        TreeNode tnChildNodes = new TreeNode();
                        tnChildNodes.Text = fInfo.Name;
                        tn.Nodes.Add(tnChildNodes);
                    }
                    ListTreeShow(dirInfo, tn);
                }
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                string path = @"D:\软件工具\Visual Studio 2008";
                DirectoryInfo dtInfo = new DirectoryInfo(path);
                TreeNode root = new TreeNode();
                root.Text = Path.GetFileName(path);
                treeView1.Nodes.Add(root);
                FileInfo[] fileInfo = dtInfo.GetFiles();
                foreach (FileInfo fInfo in fileInfo)
                {
                    TreeNode tnChildNodes = new TreeNode();
                    tnChildNodes.Text = fInfo.Name;
                    root.Nodes.Add(tnChildNodes);
                }
                ListTreeShow(dtInfo, root);

    • 已标记为答案 极度 2010年7月23日 1:25
    2010年7月22日 14:16

全部回复

  •     private void PopulateTreeView()
        {
    
          TreeNode rootNode;
    
          DirectoryInfo info = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
    
          if (info.Exists)
          {
            rootNode = new TreeNode(info.Name);
            rootNode.Tag = info;
            GetDirectories(info, rootNode);
            treeView1.Nodes.Add(rootNode);
    
          }
        }
    
    
        private void GetDirectories(DirectoryInfo root, TreeNode parentNode)
        {
    
          FileInfo[] files = root.GetFiles();
          for (int i = 0; i < files.Length; i++)
          {
            TreeNode filenode = new TreeNode();
            filenode.Text = files[i].Name;
            parentNode.Nodes.Add(filenode);
          }
    
          DirectoryInfo[] subroot = root.GetDirectories();
          for (int j = 0; j < subroot.Length; j++)
          {
            TreeNode directory = new TreeNode();
            directory.Text = subroot[j].Name;
            parentNode.Nodes.Add(directory);
    
            FileInfo[] fileInSub = subroot[j].GetFiles();
            GetDirectories(subroot[j], directory);
    
          }
    
        }
    
    
        private void button1_Click(object sender, EventArgs e)
        {
          if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
          {
            PopulateTreeView();
          }
        }
    


    If this is helpful
      { Please Mark as Answered }
    else if it is not helpful
      { Un-Mark as Answered }


    Best Regards
    Huan Li, Code Blog: Small is New Big In C#
    • 已标记为答案 极度 2010年7月23日 1:25
    2010年7月22日 13:09
  • 你好!

        你的漏洞在这里

    DirectoryInfo[] subDirectories = theDir.GetDirectories();//你只遍历了theDir下的所有目录,并没有遍历
    theDir下的文件,实际上theDir下可能也有文件
    foreach (DirectoryInfo dirInfo in subDirectories)



    周雪峰
    • 已标记为答案 极度 2010年7月23日 1:25
    2010年7月22日 13:10
    版主
  • 改了一下,但缺点是:列出后,文件在上面、目录在下面,与资源管理器顺序不一样。递归造成的。

            public static void ListTreeShow(DirectoryInfo theDir, TreeNode tnParents)
            {
                DirectoryInfo[] subDirectories = theDir.GetDirectories();
                foreach (DirectoryInfo dirInfo in subDirectories)
                {
                    TreeNode tn = new TreeNode();
                    tn.Text = dirInfo.Name;
                    tnParents.Nodes.Add(tn);
                    FileInfo[] fileInfo = dirInfo.GetFiles();
                    foreach (FileInfo fInfo in fileInfo)
                    {
                        TreeNode tnChildNodes = new TreeNode();
                        tnChildNodes.Text = fInfo.Name;
                        tn.Nodes.Add(tnChildNodes);
                    }
                    ListTreeShow(dirInfo, tn);
                }
            }
            private void Form1_Load(object sender, EventArgs e)
            {
                string path = @"D:\软件工具\Visual Studio 2008";
                DirectoryInfo dtInfo = new DirectoryInfo(path);
                TreeNode root = new TreeNode();
                root.Text = Path.GetFileName(path);
                treeView1.Nodes.Add(root);
                FileInfo[] fileInfo = dtInfo.GetFiles();
                foreach (FileInfo fInfo in fileInfo)
                {
                    TreeNode tnChildNodes = new TreeNode();
                    tnChildNodes.Text = fInfo.Name;
                    root.Nodes.Add(tnChildNodes);
                }
                ListTreeShow(dtInfo, root);

    • 已标记为答案 极度 2010年7月23日 1:25
    2010年7月22日 14:16