Populate TreeView with file system directory structure

100,513

Option #1: Recursive approach:

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;
}

Option #2: Non-recursive approach:

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);
}
Share:
100,513
Vincent Dagpin
Author by

Vincent Dagpin

Updated on November 01, 2020

Comments

  • Vincent Dagpin
    Vincent Dagpin over 3 years

    i am new with Nodes here.. :) i came up with this algorithm but it only shows the list of parent nodes.. like this..

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

    i want the next node will be put in one of the node inside the previous node.. so it will come up like this..

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

    i have some ideas in mind but i can implement it to codes.. :) any help please..

    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);
    }