//C#资源管理器源码
using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.IO; using System.Runtime.InteropServices; namespace myTree { /**//// <summary> /// Form1 的摘要说明。 /// </summary> public class Form1 : System.Windows.Forms.Form { private System.Windows.Forms.ImageList TreeImageList; private System.Windows.Forms.MainMenu mainMenu1; private System.Windows.Forms.MenuItem menuItem1; private System.Windows.Forms.ListView listView1; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.TreeView treeView1; private System.Windows.Forms.Panel panel2; private System.Windows.Forms.Panel panel1; private System.Windows.Forms.Splitter splitter1; private System.Windows.Forms.Button button1; private System.Windows.Forms.ImageList LisrimageList; private System.Windows.Forms.ImageList LisrimageList2; private System.Windows.Forms.StatusBar statusBar1; private System.Windows.Forms.StatusBarPanel statusBarPanel1; private System.Windows.Forms.StatusBarPanel statusBarPanel2; private System.Windows.Forms.MenuItem menuItem2; private System.Windows.Forms.MenuItem menuItem3; private System.Windows.Forms.MenuItem menuItem4; private System.Windows.Forms.MenuItem menuItem5; private System.Windows.Forms.MenuItem menuItem6; private System.Windows.Forms.MenuItem menuItem7; private System.Windows.Forms.Label label1; private System.ComponentModel.IContainer components; public Form1() { // // Windows 窗体设计器支持所必需的 // InitializeComponent(); Icon ic0 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 15); TreeImageList.Images.Add(ic0); Icon ic1 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 5); TreeImageList.Images.Add(ic1); Icon ic2 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 7); TreeImageList.Images.Add(ic2); Icon ic3 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 11); TreeImageList.Images.Add(ic3); Icon ic4 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 3); TreeImageList.Images.Add(ic4); Icon ic5 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 4); TreeImageList.Images.Add(ic5); Icon ic6 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 101); TreeImageList.Images.Add(ic6); GetDrive(); } /**//// <summary> /// 清理所有正在使用的资源。 /// </summary> protected override void Dispose(bool disposing) { if (disposing) { if (components != null) { components.Dispose(); } } base.Dispose(disposing); } Windows Form Designer generated code#region Windows Form Designer generated code /**//// <summary> /// 设计器支持所需的方法 - 不要使用代码编辑器修改 /// 此方法的内容。 /// </summary> private void InitializeComponent() { this.components = new System.ComponentModel.Container(); this.TreeImageList = new System.Windows.Forms.ImageList(this.components); this.mainMenu1 = new System.Windows.Forms.MainMenu(this.components); this.menuItem1 = new System.Windows.Forms.MenuItem(); this.menuItem2 = new System.Windows.Forms.MenuItem(); this.menuItem3 = new System.Windows.Forms.MenuItem(); this.menuItem4 = new System.Windows.Forms.MenuItem(); this.menuItem5 = new System.Windows.Forms.MenuItem(); this.menuItem6 = new System.Windows.Forms.MenuItem(); this.menuItem7 = new System.Windows.Forms.MenuItem(); this.listView1 = new System.Windows.Forms.ListView(); this.textBox1 = new System.Windows.Forms.TextBox(); this.treeView1 = new System.Windows.Forms.TreeView(); this.panel2 = new System.Windows.Forms.Panel(); this.label1 = new System.Windows.Forms.Label(); this.button1 = new System.Windows.Forms.Button(); this.panel1 = new System.Windows.Forms.Panel(); this.splitter1 = new System.Windows.Forms.Splitter(); this.LisrimageList = new System.Windows.Forms.ImageList(this.components); this.LisrimageList2 = new System.Windows.Forms.ImageList(this.components); this.statusBar1 = new System.Windows.Forms.StatusBar(); this.statusBarPanel1 = new System.Windows.Forms.StatusBarPanel(); this.statusBarPanel2 = new System.Windows.Forms.StatusBarPanel(); this.panel2.SuspendLayout(); this.panel1.SuspendLayout(); ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).BeginInit(); ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).BeginInit(); this.SuspendLayout(); // // TreeImageList // this.TreeImageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; this.TreeImageList.ImageSize = new System.Drawing.Size(16, 16); this.TreeImageList.TransparentColor = System.Drawing.Color.Transparent; // // mainMenu1 // this.mainMenu1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem1, this.menuItem2, this.menuItem3, this.menuItem4}); // // menuItem1 // this.menuItem1.Index = 0; this.menuItem1.Text = "文件"; // // menuItem2 // this.menuItem2.Index = 1; this.menuItem2.Text = "编辑"; // // menuItem3 // this.menuItem3.Index = 2; this.menuItem3.Text = "显隐"; this.menuItem3.Click += new System.EventHandler(this.menuItem3_Click); // // menuItem4 // this.menuItem4.Index = 3; this.menuItem4.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] { this.menuItem5, this.menuItem6, this.menuItem7}); this.menuItem4.Text = "列表方式"; // // menuItem5 // this.menuItem5.Index = 0; this.menuItem5.Text = "大图标"; this.menuItem5.Click += new System.EventHandler(this.menuItem5_Click); // // menuItem6 // this.menuItem6.Index = 1; this.menuItem6.Text = "小图标"; this.menuItem6.Click += new System.EventHandler(this.menuItem6_Click); // // menuItem7 // this.menuItem7.Index = 2; this.menuItem7.Text = "详细列表"; this.menuItem7.Click += new System.EventHandler(this.menuItem7_Click); // // listView1 // this.listView1.Activation = System.Windows.Forms.ItemActivation.OneClick; this.listView1.Dock = System.Windows.Forms.DockStyle.Fill; this.listView1.Location = new System.Drawing.Point(166, 21); this.listView1.Name = "listView1"; this.listView1.Size = new System.Drawing.Size(546, 369); this.listView1.TabIndex = 3; this.listView1.UseCompatibleStateImageBehavior = false; this.listView1.View = System.Windows.Forms.View.SmallIcon; this.listView1.ItemActivate += new System.EventHandler(this.listView1_ItemActivate); // // textBox1 // this.textBox1.Dock = System.Windows.Forms.DockStyle.Top; this.textBox1.Location = new System.Drawing.Point(0, 0); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(712, 21); this.textBox1.TabIndex = 5; // // treeView1 // this.treeView1.Anchor = ((System.Windows.Forms.AnchorStyles)((((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left) | System.Windows.Forms.AnchorStyles.Right))); this.treeView1.ItemHeight = 18; this.treeView1.Location = new System.Drawing.Point(0, 23); this.treeView1.Name = "treeView1"; this.treeView1.Size = new System.Drawing.Size(162, 343); this.treeView1.TabIndex = 1; this.treeView1.BeforeExpand += new System.Windows.Forms.TreeViewCancelEventHandler(this.treeView1_BeforeExpand_1); this.treeView1.AfterSelect += new System.Windows.Forms.TreeViewEventHandler(this.treeView1_AfterSelect_1); // // panel2 // this.panel2.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.panel2.Controls.Add(this.label1); this.panel2.Controls.Add(this.button1); this.panel2.Dock = System.Windows.Forms.DockStyle.Top; this.panel2.Location = new System.Drawing.Point(0, 0); this.panel2.Name = "panel2"; this.panel2.Size = new System.Drawing.Size(162, 22); this.panel2.TabIndex = 0; // // label1 // this.label1.Dock = System.Windows.Forms.DockStyle.Left; this.label1.Font = new System.Drawing.Font("宋体", 9F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(134))); this.label1.Location = new System.Drawing.Point(0, 0); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(42, 18); this.label1.TabIndex = 1; this.label1.Text = "文件夹"; this.label1.TextAlign = System.Drawing.ContentAlignment.BottomLeft; // // button1 // this.button1.Dock = System.Windows.Forms.DockStyle.Right; this.button1.FlatStyle = System.Windows.Forms.FlatStyle.Popup; this.button1.Location = new System.Drawing.Point(140, 0); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(18, 18); this.button1.TabIndex = 0; this.button1.Text = "X"; this.button1.Click += new System.EventHandler(this.button1_Click); // // panel1 // this.panel1.Controls.Add(this.treeView1); this.panel1.Controls.Add(this.panel2); this.panel1.Dock = System.Windows.Forms.DockStyle.Left; this.panel1.Location = new System.Drawing.Point(0, 21); this.panel1.Name = "panel1"; this.panel1.Size = new System.Drawing.Size(162, 369); this.panel1.TabIndex = 6; // // splitter1 // this.splitter1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; this.splitter1.Location = new System.Drawing.Point(162, 21); this.splitter1.Name = "splitter1"; this.splitter1.Size = new System.Drawing.Size(4, 369); this.splitter1.TabIndex = 7; this.splitter1.TabStop = false; // // LisrimageList // this.LisrimageList.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; this.LisrimageList.ImageSize = new System.Drawing.Size(16, 16); this.LisrimageList.TransparentColor = System.Drawing.Color.Transparent; // // LisrimageList2 // this.LisrimageList2.ColorDepth = System.Windows.Forms.ColorDepth.Depth8Bit; this.LisrimageList2.ImageSize = new System.Drawing.Size(16, 16); this.LisrimageList2.TransparentColor = System.Drawing.Color.Transparent; // // statusBar1 // this.statusBar1.Location = new System.Drawing.Point(0, 390); this.statusBar1.Name = "statusBar1"; this.statusBar1.Panels.AddRange(new System.Windows.Forms.StatusBarPanel[] { this.statusBarPanel1, this.statusBarPanel2}); this.statusBar1.Size = new System.Drawing.Size(712, 17); this.statusBar1.TabIndex = 8; this.statusBar1.Text = "statusBar1"; // // statusBarPanel1 // this.statusBarPanel1.BorderStyle = System.Windows.Forms.StatusBarPanelBorderStyle.None; this.statusBarPanel1.Name = "statusBarPanel1"; this.statusBarPanel1.Text = "statusBarPanel1"; this.statusBarPanel1.Width = 132; // // statusBarPanel2 // this.statusBarPanel2.BorderStyle = System.Windows.Forms.StatusBarPanelBorderStyle.None; this.statusBarPanel2.Name = "statusBarPanel2"; this.statusBarPanel2.Text = "statusBarPanel2"; this.statusBarPanel2.Width = 132; // // Form1 // this.AutoScaleBaseSize = new System.Drawing.Size(6, 14); this.ClientSize = new System.Drawing.Size(712, 407); this.Controls.Add(this.listView1); this.Controls.Add(this.splitter1); this.Controls.Add(this.panel1); this.Controls.Add(this.textBox1); this.Controls.Add(this.statusBar1); this.Menu = this.mainMenu1; this.Name = "Form1"; this.Text = "C#实现资源管理器"; this.panel2.ResumeLayout(false); this.panel1.ResumeLayout(false); ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel1)).EndInit(); ((System.ComponentModel.ISupportInitialize)(this.statusBarPanel2)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); } #endregion /**//// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main() { Application.Run(new Form1()); } //************************************************************************************* [DllImport("Shell32.dll")] public static extern int ExtractIcon(IntPtr h, string strx, int ii); [DllImport("Shell32.dll")] public static extern int SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags); public struct SHFILEINFO { public IntPtr hIcon; public int iIcon; public uint dwAttributes; public char szDisplayName; public char szTypeName; } string strFilePath = ""; //************************************************************************************* protected virtual Icon myExtractIcon(string FileName, int iIndex) { try { IntPtr hIcon = (IntPtr)ExtractIcon(this.Handle, FileName, iIndex); if (!hIcon.Equals(null)) { Icon icon = Icon.FromHandle(hIcon); return icon; } } catch (Exception ex) { MessageBox.Show(ex.Message, "错误提示", 0, MessageBoxIcon.Error); } return null; } //************************************************************************************* protected virtual void SetIcon(ImageList imageList, string FileName, bool tf) { SHFILEINFO fi = new SHFILEINFO(); if (tf == true) { int iTotal = (int)SHGetFileInfo(FileName, 0, ref fi, 100, 16640);//SHGFI_ICON|SHGFI_SMALLICON try { if (iTotal > 0) { Icon ic = Icon.FromHandle(fi.hIcon); imageList.Images.Add(ic); //return ic; } } catch (Exception ex) { MessageBox.Show(ex.Message, "错误提示", 0, MessageBoxIcon.Error); } } else { int iTotal = (int)SHGetFileInfo(FileName, 0, ref fi, 100, 257); try { if (iTotal > 0) { Icon ic = Icon.FromHandle(fi.hIcon); imageList.Images.Add(ic); //return ic; } } catch (Exception ex) { MessageBox.Show(ex.Message, "错误提示", 0, MessageBoxIcon.Error); } } // return null; } //************************************************************************************* public void GetDrive() { treeView1.ImageList = TreeImageList; treeView1.BeginUpdate(); treeView1.Nodes.Clear(); TreeNode RootNode = new TreeNode("我的电脑", 0, 0); treeView1.Nodes.Add(RootNode); int iImageIndex = 2; int iSelectedIndex = 2; string[] astrDrives = Directory.GetLogicalDrives(); foreach (string str in astrDrives) { if (str == "A:\\") { iImageIndex = 1; iSelectedIndex = 1; } else if (str == "G:\\") { iImageIndex = 3; iSelectedIndex = 3; } else { iImageIndex = 2; iSelectedIndex = 2; } TreeNode tnDrive = new TreeNode(str, iImageIndex, iSelectedIndex); treeView1.Nodes[0].Nodes.Add(tnDrive); AddDirectories(tnDrive); if (str == "C:\\") { treeView1.SelectedNode = tnDrive; } } treeView1.EndUpdate(); } //************************************************************************************* void AddDirectories(TreeNode tn) { tn.Nodes.Clear(); string strPath = tn.FullPath; strPath = strPath.Remove(0, 5); //获得当前目录 DirectoryInfo dirinfo = new DirectoryInfo(strPath); DirectoryInfo[] adirinfo; try { adirinfo = dirinfo.GetDirectories(); } catch { return; } int iImageIndex = 4; int iSelectedIndex = 5; foreach (DirectoryInfo di in adirinfo) { if (di.Name == "RECYCLER" || di.Name == "RECYCLED" || di.Name == "Recycled") { iImageIndex = 6; iSelectedIndex = 6; } else { iImageIndex = 4; iSelectedIndex = 5; } TreeNode tnDir = new TreeNode(di.Name, iImageIndex, iSelectedIndex); tn.Nodes.Add(tnDir); } /**//* //获得当前目录下的所有文件 FileInfo[] dirFiles; dirFiles=dirinfo.GetFiles(); int iCount=7; foreach (FileInfo fi in dirFiles) { //得到每个文件的图标 string str=fi.FullName; try { SetIcon(TreeImageList,str,false); } catch(Exception ex) { MessageBox.Show(ex.Message,"错误提示",0,MessageBoxIcon.Error);} TreeNode tnDir = new TreeNode(fi.Name, iCount, iCount); tn.Nodes.Add(tnDir); iCount++; } */ } //************************************************************************************* //在大图标、小图标、详细列表切换时调用 protected virtual void ListViewAB(int iii) { if (iii == 1) { LisrimageList2.ImageSize = new Size(32, 32); listView1.LargeImageList = LisrimageList2; if (listView1.View == View.Details || listView1.View == View.SmallIcon) { listView1.View = View.LargeIcon; } } else if (iii == 2) { if (listView1.View == View.Details || listView1.View == View.LargeIcon) { listView1.View = View.SmallIcon; } } else { if (listView1.View == View.LargeIcon || listView1.View == View.SmallIcon) { listView1.View = View.Details; } } } //************************************************************************************* private void treeView1_BeforeExpand_1(object sender, System.Windows.Forms.TreeViewCancelEventArgs e) { //base.OnBeforeExpand(e); treeView1.BeginUpdate(); foreach (TreeNode tn in e.Node.Nodes) { AddDirectories(tn); } treeView1.EndUpdate(); } //************************************************************************************* protected virtual void InitList(TreeNode tn) { this.statusBarPanel1.Text = "正在刷新文件夹,请稍等.."; this.Cursor = Cursors.WaitCursor; this.LisrimageList2.Images.Clear(); this.LisrimageList.Images.Clear(); listView1.SmallImageList = LisrimageList; Icon ic0 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 3); LisrimageList.Images.Add(ic0); LisrimageList2.Images.Add(ic0); listView1.Clear(); //设置列表框的表头 listView1.Columns.Add("文件名", 160, HorizontalAlignment.Left); listView1.Columns.Add("文件大小", 120, HorizontalAlignment.Left); listView1.Columns.Add("创建时间", 120, HorizontalAlignment.Left); listView1.Columns.Add("访问时间", 200, HorizontalAlignment.Left); string strPath = tn.FullPath; strPath = strPath.Remove(0, 5); //获得当前目录下的所有文件 DirectoryInfo curDir = new DirectoryInfo(strPath);//创建目录对象。 FileInfo[] dirFiles; try { dirFiles = curDir.GetFiles(); } catch { return; } string[] arrSubItem = new string[4]; //文件的创建时间和访问时间。 int iCount = 0; int iconIndex = 1;//用1,而不用0是要让过0号图标。 foreach (FileInfo fileInfo in dirFiles) { string strFileName = fileInfo.Name; //如果不是文件pagefile.sys if (!strFileName.Equals("pagefile.sys")) { arrSubItem[0] = strFileName; arrSubItem[1] = fileInfo.Length + " 字节"; arrSubItem[2] = fileInfo.CreationTime.ToString(); arrSubItem[3] = fileInfo.LastAccessTime.ToString(); } else { arrSubItem[1] = "未知大小"; arrSubItem[2] = "未知日期"; arrSubItem[3] = "未知日期"; } //得到每个文件的图标 string str = fileInfo.FullName; try { SetIcon(LisrimageList, str, false); SetIcon(LisrimageList2, str, true); } catch (Exception ex) { MessageBox.Show(ex.Message, "错误提示", 0, MessageBoxIcon.Error); } //插入列表项 ListViewItem LiItem = new ListViewItem(arrSubItem, iconIndex); listView1.Items.Insert(iCount, LiItem); iCount++; iconIndex++; } strFilePath = strPath; textBox1.Text = strPath; this.statusBarPanel1.Text = strPath; this.statusBarPanel2.Text = "文件数量: " + iCount.ToString() + "个"; this.Cursor = Cursors.Arrow; //以下是向列表框中插入目录,不是文件。获得当前目录下的各个子目录。 int iItem = 0; DirectoryInfo Dir = new DirectoryInfo(strPath); foreach (DirectoryInfo di in Dir.GetDirectories()) { ListViewItem LiItem = new ListViewItem(di.Name, 0); listView1.Items.Insert(iItem, LiItem); iItem++; } } //************************************************************************************* protected virtual void InitList2(string strName) { this.statusBarPanel1.Text = "正在刷新文件夹,请稍等.."; this.Cursor = Cursors.WaitCursor; this.LisrimageList2.Images.Clear(); this.LisrimageList.Images.Clear(); listView1.SmallImageList = LisrimageList; Icon ic0 = myExtractIcon("%SystemRoot%\\system32\\shell32.dll", 3); LisrimageList.Images.Add(ic0); LisrimageList2.Images.Add(ic0); listView1.Clear(); //设置列表框的表头 listView1.Columns.Add("文件名", 160, HorizontalAlignment.Left); listView1.Columns.Add("文件大小", 120, HorizontalAlignment.Left); listView1.Columns.Add("创建时间", 120, HorizontalAlignment.Left); listView1.Columns.Add("访问时间", 200, HorizontalAlignment.Left); //获得当前目录下的所有文件 DirectoryInfo curDir = new DirectoryInfo(strName);//创建目录对象。 FileInfo[] dirFiles; try { dirFiles = curDir.GetFiles(); } catch { return; } string[] arrSubItem = new string[4]; //文件的创建时间和访问时间。 int iCount = 0; int iconIndex = 1;//用1,而不用0是要让过0号图标。 foreach (FileInfo fileInfo in dirFiles) { string strFileName = fileInfo.Name; //如果不是文件pagefile.sys if (!strFileName.Equals("pagefile.sys")) { arrSubItem[0] = strFileName; arrSubItem[1] = fileInfo.Length + " 字节"; arrSubItem[2] = fileInfo.CreationTime.ToString(); arrSubItem[3] = fileInfo.LastAccessTime.ToString(); } else { arrSubItem[1] = "未知大小"; arrSubItem[2] = "未知日期"; arrSubItem[3] = "未知日期"; } //得到每个文件的图标 string str = fileInfo.FullName; try { SetIcon(LisrimageList, str, false); SetIcon(LisrimageList2, str, true); } catch (Exception ex) { MessageBox.Show(ex.Message, "错误提示", 0, MessageBoxIcon.Error); } //插入列表项 ListViewItem LiItem = new ListViewItem(arrSubItem, iconIndex); listView1.Items.Insert(iCount, LiItem); iCount++; iconIndex++;//必须加在listView1.Items.Insert(iCount,LiItem); } strFilePath = strName;//把路径赋值于全局变量strFilePath textBox1.Text = strName; this.statusBarPanel2.Text = "文件数量: " + iCount.ToString() + "个"; this.Cursor = Cursors.Arrow; //以下是向列表框中插入目录,不是文件。获得当前目录下的各个子目录。 int iItem = 0;//调用listView1.Items.Insert(iItem,LiItem);时用。不能使用iconIndex。 DirectoryInfo Dir = new DirectoryInfo(strName);//创建目录对象。 foreach (DirectoryInfo di in Dir.GetDirectories()) { ListViewItem LiItem = new ListViewItem(di.Name, 0); listView1.Items.Insert(iItem, LiItem); iItem++; } } //************************************************************************************* private void treeView1_AfterSelect_1(object sender, System.Windows.Forms.TreeViewEventArgs e) { if (e.Node.Text == "我的电脑") { return; } InitList(e.Node); } //************************************************************************************* private void button1_Click(object sender, System.EventArgs e) { this.panel1.Hide(); } //************************************************************************************* private void listView1_ItemActivate(object sender, System.EventArgs e) { string str = Path.Combine(strFilePath, listView1.FocusedItem.Text); try { if (listView1.FocusedItem.SubItems.Count > 1) { System.Diagnostics.Process.Start(str); } else { InitList2(str); } } catch { return; } } //************************************************************************************* private void menuItem3_Click(object sender, System.EventArgs e) { this.panel1.Visible = !panel1.Visible; } //************************************************************************************* private void menuItem5_Click(object sender, System.EventArgs e) { ListViewAB(1); } //************************************************************************************* private void menuItem6_Click(object sender, System.EventArgs e) { ListViewAB(2); } //************************************************************************************* private void menuItem7_Click(object sender, System.EventArgs e) { ListViewAB(3); } //************************************************************************************* } } |
|