【问题标题】:Populate TreeView with file system directory structure使用文件系统目录结构填充 TreeView
【发布时间】:2011-09-08 12:48:02
【问题描述】:

我在这里是新的节点.. :) 我想出了这个算法,但它只显示父节点的列表.. 像这样..

a
   a.txt
   b
   c
c
   m
   n
b
   o
   p
etc...

我希望将下一个节点放在前一个节点内的一个节点中..所以它会像这样出现..

a
   a.txt
   b
      o
      p
   c
      m
      n
etc...

我有一些想法,但我可以将其实现为代码.. :) 请提供任何帮助..

private void ListDirectory(TreeView treeView, String path)
{            
    Stack<string> stack = new Stack<string>();
    TreeNode DirFilesCollection = new TreeNode();

    stack.Push(path);            

    while (stack.Count > 0)
    {
        string dir = stack.Pop();
        try
        {
            List<String> parentDir = new List<string>();
            parentDir.AddRange(Directory.GetFiles(dir, "*.*"));
            parentDir.AddRange(Directory.GetDirectories(dir));

            DirectoryInfo d = new DirectoryInfo(dir);
            TreeNode TParent = new TreeNode(d.Name);

            foreach (String s in parentDir)
            {
                FileInfo f = new FileInfo(s);
                TreeNode subItems = new TreeNode(f.Name);

                TParent.Nodes.Add(subItems);
            }

            DirFilesCollection.Nodes.Add(TParent);

            foreach (string dn in Directory.GetDirectories(dir))
            {
                stack.Push(dn);
            }
        }
        catch
        {}
    }

    Action clearTreeView = () => treeView.Nodes.Clear();
    this.Invoke(clearTreeView);

    Action showTreeView = () => treeView.Nodes.Add(DirFilesCollection);
    this.Invoke(showTreeView);
}

【问题讨论】:

    标签: c# .net winforms treeview directory-structure


    【解决方案1】:

    选项 #1:递归方法:

    private void ListDirectory(TreeView treeView, string path)
    {
        treeView.Nodes.Clear();
        var rootDirectoryInfo = new DirectoryInfo(path);
        treeView.Nodes.Add(CreateDirectoryNode(rootDirectoryInfo));
    }
    
    private static TreeNode CreateDirectoryNode(DirectoryInfo directoryInfo)
    {
        var directoryNode = new TreeNode(directoryInfo.Name);
        foreach (var directory in directoryInfo.GetDirectories())
            directoryNode.Nodes.Add(CreateDirectoryNode(directory));
        foreach (var file in directoryInfo.GetFiles())
            directoryNode.Nodes.Add(new TreeNode(file.Name));
        return directoryNode;
    }
    

    选项 #2:非递归方法:

    private static void ListDirectory(TreeView treeView, string path)
    {
        treeView.Nodes.Clear();
    
        var stack = new Stack<TreeNode>();
        var rootDirectory = new DirectoryInfo(path);
        var node = new TreeNode(rootDirectory.Name) { Tag = rootDirectory };
        stack.Push(node);
    
        while (stack.Count > 0)
        {
            var currentNode = stack.Pop();
            var directoryInfo = (DirectoryInfo)currentNode.Tag;
            foreach (var directory in directoryInfo.GetDirectories())
            {
                var childDirectoryNode = new TreeNode(directory.Name) { Tag = directory };
                currentNode.Nodes.Add(childDirectoryNode);
                stack.Push(childDirectoryNode);
            }
            foreach (var file in directoryInfo.GetFiles())
                currentNode.Nodes.Add(new TreeNode(file.Name));
        }
    
        treeView.Nodes.Add(node);
    }
    

    【讨论】:

    • @vrynxzent - 如果您有兴趣,也可以使用非递归方法更新答案。
    • 啊..我明白了..我更喜欢使用非递归,因为线程和尝试捕获..我也可以在递归方法中做到这一点,但我需要查看更新数据的形式获取文件和目录..
    • 我同时使用了递归和迭代函数,这是我的代码,但编译器返回错误:访问路径“E:\System Volume Information\”被拒绝。;这是我的代码:ListDirectory(treeView1,@"E:\");
    • 对 UnauthorizedAccessException 使用 try-catch。
    • 我遇到了 currentNode.Nodes.Add() 异常。我将其更改为 currentNode.ChildNodes.Add() 并且它可以工作
    猜你喜欢
    • 1970-01-01
    • 2014-09-21
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 2018-12-24
    • 2019-01-30
    相关资源
    最近更新 更多