using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Files { public class Node : TreeNode { public Data data; } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.ComponentModel; namespace Files { public class Data { [ Category ("Basic") ] public string Name { get; set; } [ Category("Basic")] [ DisplayName ("Full path")] public string Path { get; set; } [Category("Basic")] [ Description ("File size in bytes")] public long Size { get; set; } [Category("Basic")] [ Description("Last write time in UTC")] public DateTime Time { get; set; } [ Browsable (false) ] public bool Directory { get; set; } public bool Ready { get; set; } } } using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.IO; namespace Files { public partial class Form1 : Form { public Form1() { InitializeComponent(); // using System.IO; treeView1.ShowNodeToolTips = true; DriveInfo[] disks = DriveInfo.GetDrives (); foreach (var disk in disks) { Display (treeView1.Nodes, disk.RootDirectory, 2); } } private void Display (TreeNodeCollection branch, DirectoryInfo dir, int level) { var node = new Node(); node.Text = dir.Name; node.ToolTipText = dir.FullName; node.data = new Data(); node.data.Name = dir.Name; node.data.Path = dir.FullName; node.data.Time = dir.LastWriteTimeUtc; node.data.Directory = true; branch.Add (node); if (level > 1) DisplaySubdir (node, dir, level-1); } private void DisplaySubdir (Node target, DirectoryInfo dir, int level) { try { foreach (var subdir in dir.GetDirectories()) Display (target.Nodes, subdir, level - 1); foreach (var file in dir.GetFiles()) DisplayFile (target.Nodes, file); target.data.Ready = true; } catch (Exception ex) { var info = new TreeNode(); info.Text = ex.Message; info.ToolTipText = ex.StackTrace; info.ForeColor = Color.Red; target.Nodes.Add(info); } } private void DisplayFile (TreeNodeCollection branch, FileInfo file) { var node = new Node(); node.Text = file.Name; node.ToolTipText = file.FullName; node.data = new Data(); node.data.Name = file.Name; node.data.Path = file.FullName; node.data.Size = file.Length; node.data.Time = file.LastWriteTimeUtc; branch.Add(node); } private void treeView1_AfterSelect(object sender, TreeViewEventArgs e) { if (e.Node is Node) { var data = (e.Node as Node).data; propertyGrid1.SelectedObject = data; } else { propertyGrid1.SelectedObject = null; } } private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) { foreach (TreeNode t in e.Node.Nodes) if (t is Node) { Node n = t as Node; if (n.data.Directory && ! n.data.Ready) DisplaySubdir (n, new DirectoryInfo(n.data.Path), 2); } } private void quitToolStripMenuItem_Click(object sender, EventArgs e) { Close(); } } }