http://kmlinux/~culik/wiki namespace tree { public class MyNode : TreeNode { public string path; public bool scanned = false; } } private void showDrives (TreeNodeCollection above) { DriveInfo [] info = DriveInfo.GetDrives (); foreach (DriveInfo d in info) { MyNode node = new MyNode(); node.path = d.ToString(); node.Text = d.Name; node.ToolTipText = d.ToString(); above.Add(node); showDir2 (node, d.RootDirectory, 1); } } private void showDir2 (MyNode above, DirectoryInfo dir, int level) { try { above.scanned = true; foreach (DirectoryInfo d in dir.GetDirectories()) { MyNode node = new MyNode(); node.path = d.FullName; node.Text = d.Name; node.ToolTipText = d.FullName; above.Nodes.Add(node); if (level > 1) showDir2(node, d, level - 1); } } catch (Exception e) { TreeNode node = new TreeNode(); node.Text = e.ToString(); node.ForeColor = Color.Red; } } private void treeView1_BeforeExpand(object sender, TreeViewCancelEventArgs e) { // e.Cancel = true; MyNode node = e.Node as MyNode; if (node != null) showDir3 (node, 2); } private void showDir3 (MyNode above, int level) { if (above.scanned) { if (level > 1) foreach (MyNode n in above.Nodes) showDir3 (n, level - 1); } else { showDir2 (above, new DirectoryInfo (above.path), level); } } private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { listView1.Items.Clear (); while (tabControl1.TabPages.Count >= 2) tabControl1.TabPages.RemoveAt (1); MyNode node = e.Node as MyNode; if (node != null) { try { DirectoryInfo dir = new DirectoryInfo(node.path); FileInfo[] files = dir.GetFiles(); foreach (FileInfo f in files) { ListViewItem item = new ListViewItem(); item.Text = f.Name; item.ToolTipText = f.FullName; item.SubItems.Add("" + f.Length); item.SubItems.Add("" + f.LastWriteTime); listView1.Items.Add(item); /* Icon icon = Icon.ExtractAssociatedIcon(f.FullName); imageList1.Images.Add(icon); item.ImageIndex = imageList1.Images.Count; */ string key = f.Extension; bool img = false; if (key == ".jpg" || key == ".bmp") { key = f.Name; img = true; } if (!imageList1.Images.ContainsKey(key)) { if (!img) { Icon icon = Icon.ExtractAssociatedIcon(f.FullName); imageList1.Images.Add(key, icon); } else { Bitmap p = new Bitmap (f.FullName); Bitmap t = new Bitmap (imageList1.ImageSize.Width, imageList1.ImageSize.Height); Graphics g = Graphics.FromImage (t); g.DrawImage (p, 0, 0, t.Width, t.Height); imageList1.Images.Add(key, t); } } item.ImageIndex = imageList1.Images.IndexOfKey(key); } } catch (Exception ee) { ListViewItem item = new ListViewItem (); item.Text = ee.ToString(); item.ForeColor = Color.Red; } } } private void showDir(TreeNode above, string path) { // using System.IO; DirectoryInfo dir = new DirectoryInfo (path); DirectoryInfo [] info = dir.GetDirectories (); foreach (DirectoryInfo d in info) { TreeNode node = new TreeNode (); node.Text = d.Name; node.ToolTipText = d.FullName; if (above == null) treeView1.Nodes.Add(node); else above.Nodes.Add(node); showDir(node, d.FullName); } } private void listView1_DoubleClick(object sender, EventArgs e) { foreach (ListViewItem item in listView1.SelectedItems) { String s = item.ToolTipText; TabPage page = new TabPage(); page.Text = s; tabControl1.TabPages.Add(page); if (s.EndsWith(".jpg") || s.EndsWith(".bmp")) { Panel p = new Panel(); p.Parent = page; p.Dock = DockStyle.Fill; p.BackgroundImage = new Bitmap(s); } } }