自己动手做一个小型“资源管理器”吧
自己动手做一个小型“资源管理器”吧
注:tvDirectory是treeView控件,lvDirectory是listView控件
首先搭建一下界面:
左边是treeView控件,右边是listView控件。(listView的网格线只需把GridLins设置成True就可以了。)
由于要用到IO流,所以别忘了导入命名空间:using System.IO;
我们只要创建一个文件类就可以了:
1 public class MyFile 2 { 3 //文件长度 4 public float FileLength { get; set; } 5 //文件名 6 public string FileName { get; set; } 7 //文件路径 8 public string FilePath { get; set; } 9 //文件类型 10 public string FileType { get; set; } 11 }
现在先来加载一下驱动器,四行代码轻松搞定:
1 //加载驱动器 2 private void LoadRootNode() 3 { 4 TreeNode tn = new TreeNode(); 5 tn.Text = "D:\\"; 6 tn.Tag = "D:\\"; 7 this.tvDirectory.Nodes.Add(tn); 8 }
接下来是一步步的绑定:
1 private void BingInfo(TreeNode node) 2 { 3 //绑定子目录 4 DirectoryInfo directoryInfo = new DirectoryInfo(node.Tag.ToString()); 5 DirectoryInfo[] dirs = directoryInfo.GetDirectories(); 6 foreach (DirectoryInfo di in dirs) 7 { 8 TreeNode temp = new TreeNode(); 9 temp.Text = di.Name; 10 temp.Tag = di.FullName; 11 node.Nodes.Add(temp); 12 } 13 14 //绑定本目录中的文件 15 FileInfo[] fileInfo = directoryInfo.GetFiles(); 16 List<MyFile> files = new List<MyFile>(); 17 foreach (FileInfo myFile in fileInfo) 18 { 19 MyFile file = new MyFile(); 20 file.FileName = myFile.Name; 21 file.FileLength = myFile.Length; 22 file.FileType = myFile.Extension; 23 file.FilePath = myFile.FullName; 24 files.Add(file); 25 } 26 //绑定listView 27 ListViewItem item = null; 28 this.lvDirectory.Items.Clear(); 29 foreach (MyFile file in files) 30 { 31 item = new ListViewItem(); 32 item.Text = file.FileName; 33 item.SubItems.Add(file.FileLength.ToString()); 34 item.SubItems.Add(file.FileType); 35 item.SubItems.Add(file.FilePath); 36 this.lvDirectory.Items.Add(item); 37 }
绑定listView也可以单独写成一个方法然后在BingInfo()方法中调用一下:
1 public void ShowFiles(List<MyFile> files) 2 { 3 ListViewItem item = null; 4 this.lvDirectory.Items.Clear(); 5 foreach (MyFile file in files) 6 { 7 item = new ListViewItem(); 8 item.Text = file.FileName; 9 item.SubItems.Add(file.FileLength.ToString()); 10 item.SubItems.Add(file.FileType); 11 item.SubItems.Add(file.FilePath); 12 this.lvDirectory.Items.Add(item); 13 } 14 15 }
调用方法:
1 ShowFiles(files);
之后需要在treeView控件的AfterSelect事件中添加如下代码:
1 private void tvDirectory_AfterSelect(object sender, TreeViewEventArgs e) 2 { 3 TreeNode node = this.tvDirectory.SelectedNode; 4 this.BingInfo(node); 5 }
再在Load中调用一下就可以正常查看显示你所想要看的资源目录了:
1 private void Form1_Load(object sender, EventArgs e) 2 { 3 LoadRootNode(); 4 }
既然是资源管理器,那么肯定要有文件的复制和删除等基本功能,接下来实现复制和删除功能:
复制时需要弹出“浏览文件夹”窗口,这时需要用到FolderBrowserDialog类:
1 //提示用户选择文件夹 2 FolderBrowserDialog fbd = new FolderBrowserDialog(); 3 DialogResult result = fbd.ShowDialog();
复制时如果选择了正确的位置,则执行复制操作:
1 if (result == DialogResult.OK) 2 { 3 desPath = fbd.SelectedPath; 4 desPath += "\\" + lvDirectory.SelectedItems[0].SubItems[0].Text; 5 //复制文件 6 File.Copy(sourcePath, desPath); 7 MessageBox.Show("复制成功!"); 8 }
完整复制代码如下:
1 private void tsmiCopy_Click(object sender, EventArgs e) 2 { 3 if (this.lvDirectory.SelectedItems.Count == 0) 4 { 5 return; 6 } 7 //提示用户选择文件夹 8 FolderBrowserDialog fbd = new FolderBrowserDialog(); 9 DialogResult result = fbd.ShowDialog(); 10 11 //源文件路径 12 string sourcePath = lvDirectory.SelectedItems[0].SubItems[3].Text; 13 //目标文件路径 14 string desPath = null; 15 //如果正确选择目标位置,执行复制操作 16 17 if (result == DialogResult.OK) 18 { 19 desPath = fbd.SelectedPath; 20 desPath += "\\" + lvDirectory.SelectedItems[0].SubItems[0].Text; 21 //复制文件 22 File.Copy(sourcePath, desPath); 23 MessageBox.Show("复制成功!"); 24 } 25 }
接下来是删除,删除完要及时刷新:
1 this.lvDirectory.SelectedItems[0].Remove();
完整删除代码如下:
1 private void tmsiDelete_Click(object sender, EventArgs e) 2 { 3 if (this.lvDirectory.SelectedItems.Count == 0) 4 { 5 return; 6 } 7 //要删除的文件 8 string sourcePath = lvDirectory.SelectedItems[0].SubItems[3].Text; 9 DialogResult result = MessageBox.Show(this, "确定要删除吗?", "警告!", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning); 10 if (result == DialogResult.OK) 11 { 12 File.Delete(sourcePath); 13 MessageBox.Show("删除成功!"); 14 } 15 //刷新一下 16 this.lvDirectory.SelectedItems[0].Remove(); 17 }
以上就是一个小型的资源管理器的制作过程了。
完成之后界面:
这里我只写了D盘,大家可以接着写其他的盘符。
跨驱动器复制方法:
1 private void CopyDirectoryAndFiles(string des, DirectoryInfo srcDir) 2 { 3 if (!des.EndsWith("\\")) 4 { 5 des += "\\"; 6 } 7 string desPath = des + srcDir.Name + "\\"; 8 if(!Directory.Exists(desPath)) 9 { 10 Directory.CreateDirectory(desPath); 11 } 12 13 foreach (FileInfo file in srcDir.GetFiles()) 14 { 15 file.CopyTo(desPath + file.Name, true); 16 } 17 foreach (DirectoryInfo dirinfo in srcDir.GetDirectories()) 18 { 19 CopyDirectoryAndFiles(desPath, dirinfo); 20 } 21 }
C#路径书写的问题:
如果写成
1 string path="D:\Text.txt";
程序会报“无法识别的转义序列”错误,所以C#提供了两种方法:
1 (第一种)将路径改为“D:\\Text.txt”
1 (第二种)@“D:\\Text.txt”