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);
}
Author by
Vincent Dagpin
Updated on November 01, 2020Comments
-
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); }