版权所有,禁止匿名转载;禁止商业使用。
使用ListView模仿Windows系统的资源管理器界面,实现文件(夹)的浏览、重命名、删除及查询等功能,主要功能界面展示如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.IO; namespace Controls { public partial class MainForm : Form { #region 成员变量 /// <summary> /// 用于递归计算文件夹大小 /// </summary> private long folderSize = 0; /// <summary> ///打开文件夹根路径 /// </summary> private string rootPath = string.Empty; #endregion #region 初期化 /// <summary> /// 默认构造函数 /// </summary> public MainForm() { InitializeComponent(); //给窗体注册键盘事件 this.KeyPreview = true; } /// <summary> /// 初始化窗体,绑定事件 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MainForm_Load(object sender, EventArgs e) { this.大图标ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click); this.详细信息ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click); this.平铺ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click); this.小图标ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click); this.列表ToolStripMenuItem.Click += new System.EventHandler(this.ToolStripMenuItem_Click); } #endregion #region 事件处理 /// <summary> /// 搜索框符合条件的人员 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnSearch_Click(object sender, EventArgs e) { AddItemsToListView(txtPath.Text, txtSearch.Text.Trim()); AddHeaderToListView(this.lvwData); } /// <summary> /// 给搜索框添加Enter快捷键 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void MainForm_KeyDown(object sender, KeyEventArgs e) { //搜索框获得焦点且按下Enter键时,执行搜索 if (txtSearch.Focused && e.KeyCode == Keys.Enter) { this.btnSearch_Click(sender, e); } } /// <summary> /// 返回上级目录 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnUp_Click(object sender, EventArgs e) { if (txtPath.Text == rootPath || !txtPath.Text.Contains("\\")) { return; } //找到文件夹上级目录的绝对路径 txtPath.Text = txtPath.Text.Substring(0, txtPath.Text.LastIndexOf("\\")); AddItemsToListView(txtPath.Text); AddHeaderToListView(this.lvwData); } /// <summary> /// 打开文件夹,显示文件夹 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnFolder_Click(object sender, EventArgs e) { DialogResult dr = fbdData.ShowDialog(); string path = fbdData.SelectedPath.ToString(); if (dr == DialogResult.OK && path != "") { rootPath = path; txtPath.Text = path; } } /// <summary> /// 新建文件夹,选中文件夹 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnAdd_Click(object sender, EventArgs e) { string fullpath = string.Empty; AddForm addForm = new AddForm(btnAdd.Text); addForm.ShowDialog(); if (addForm.ButtonFlag) { fullpath = txtPath.Text + "\\" + addForm.TxtName; } else { return; //排除关闭窗口异常 } try { if (Directory.Exists(fullpath)) { MessageBox.Show("该文件名已经存在!", "提示"); return; } Directory.CreateDirectory(fullpath); AddItemsToListView(txtPath.Text); AddHeaderToListView(this.lvwData); } catch (NullReferenceException ex) { MessageBox.Show(ex.Message, "提示"); } finally { //选中新增的项,并显示在视野范围内 for (int i = 0; i < lvwData.Items.Count; i++) { if (lvwData.Items[i].Tag.ToString() == fullpath) { //先设置ListView选中 lvwData.Focus(); lvwData.Items[i].Selected = true; //在视野范围内显示 lvwData.EnsureVisible(i); break; } } } } /// <summary> /// 重命名文件夹 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnRename_Click(object sender, EventArgs e) { if (lvwData.SelectedItems.Count <= 0) { return; } string fullName = lvwData.SelectedItems[0].Tag.ToString(); string path = fullName.Substring(0, fullName.LastIndexOf("\\") + 1);//文件路径 string suffix = GetSuffixName(fullName);//后缀名 //文件名或文件夹名 string fileName = string.Empty; if (suffix != string.Empty) { fileName = fullName.Substring(fullName.LastIndexOf("\\") + 1, fullName.LastIndexOf(".") - fullName.LastIndexOf("\\") - 1);//文件名 } else { fileName = fullName.Substring(fullName.LastIndexOf("\\") + 1);//文件夹名 } string fullPath = string.Empty; AddForm addForm = new AddForm(btnRename.Text, fileName); addForm.ShowDialog(); if (suffix != string.Empty) { fullPath = path + addForm.TxtName + "." + suffix; } else { fullPath = path + addForm.TxtName; } //直接关闭窗口时 if (!addForm.ButtonFlag) { return; } try { //重命名文件夹 if (suffix == string.Empty) { if (Directory.Exists(fullPath)) { MessageBox.Show("该文件名已经存在!", "提示"); return; } Directory.Move(fullName, fullPath); } //重命名文件 else { if (File.Exists(fullPath)) { MessageBox.Show("该文件名已经存在!", "提示"); return; } File.Move(fullName, fullPath); } AddItemsToListView(txtPath.Text); AddHeaderToListView(this.lvwData); } catch (NullReferenceException ex) { MessageBox.Show(ex.Message); } } /// <summary> /// 删除文件夹 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnDelete_Click(object sender, EventArgs e) { int count = lvwData.SelectedItems.Count; if (count <= 0) { return; } DialogResult result = MessageBox.Show("你确定删除这" + count + "项吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { string path; ListViewItem selectitem; for (int i = 0; i < lvwData.SelectedItems.Count; ) //此处不能i++ { selectitem = lvwData.SelectedItems[i]; path = selectitem.Tag.ToString(); lvwData.Items.Remove(selectitem); if (File.Exists(path)) { File.Delete(path); } else if (Directory.Exists(path)) { Directory.Delete(path, true); } lvwData.Update(); } } } /// <summary> /// List选中项时发生 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void lvwData_ItemActivate(object sender, EventArgs e) { ListView lv = (ListView)sender; if (lv.SelectedItems.Count <= 0) { return; } string filename = lv.SelectedItems[0].Tag.ToString(); //如果是文件夹,就打开它 if (Directory.Exists(filename)) { AddItemsToListView(filename); AddHeaderToListView(this.lvwData); //获取打开的文件夹路径 txtPath.Text = filename; } //如果是文件,就执行它 else { System.Diagnostics.Process.Start(filename); } } /// <summary> /// 根据路径的后缀名控制按钮的状态 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void txtPath_TextChanged(object sender, EventArgs e) { AddItemsToListView(txtPath.Text); AddHeaderToListView(this.lvwData); } /// <summary> /// ListView列表显示样式 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void ToolStripMenuItem_Click(object sender, EventArgs e) { ToolStripMenuItem tsMenumItem = sender as ToolStripMenuItem; if (tsMenumItem.Checked) { return;//已经选中则返回 } else { //清除勾选的右键菜单项 ClearCheckState(cmsStyle); //勾选选中的右键菜单项 tsMenumItem.Checked = true; } switch (tsMenumItem.Text) { case "大图标": lvwData.View = View.LargeIcon; break; case "详细信息": lvwData.View = View.Details; break; case "小图标": lvwData.View = View.SmallIcon; break; case "列表": lvwData.View = View.List; break; case "平铺": lvwData.View = View.Tile; break; } } /// <summary> /// 清除勾选的右键菜单项 /// </summary> /// <param name="cms">右键菜单</param> /// <param name="clearAll">是否全部清除</param> private void ClearCheckState(ContextMenuStrip cms, bool clearAll = false) { ToolStripMenuItem tsMenumItemTemp; for (int i = 0; i < cms.Items.Count; i++) { if (!(cms.Items[i] is ToolStripMenuItem)) { continue; } tsMenumItemTemp = cms.Items[i] as ToolStripMenuItem; if (tsMenumItemTemp.Checked) { tsMenumItemTemp.Checked = false; if (!clearAll) { break; } } } } #endregion #region 设置ListView的显示样式 /// <summary> /// 根据后缀名,设置listview显示样式 /// </summary> /// <param name="root">根节点</param> /// <param name="keywords">搜索关键字</param> private void AddItemsToListView(string root, string keywords = "") { //把listview里的所有选项与所有列名都删除 lvwData.Clear(); lvwData.BeginUpdate(); //文件 if (File.Exists(root)) { AddFileToListView(new FileInfo(root), keywords); } //文件夹 else { DirectoryInfo dir = new DirectoryInfo(root); DirectoryInfo[] dirs = dir.GetDirectories(); FileInfo[] files = dir.GetFiles(); //把文件夹信息添加到listview的选项中 foreach (DirectoryInfo directoryInfo in dirs) { AddFolderToListView(directoryInfo, keywords); } //把文件夹下文件信息添加到listview的选项中 foreach (FileInfo fileInfo in files) { AddFileToListView(fileInfo, keywords); } } this.lvwData.EndUpdate(); } /// <summary> /// 将文件添加到ListView中显示 /// </summary> /// <param name="fileInfo">文件全路径</param> /// <param name="keywords">搜索关键字</param> private void AddFileToListView(FileInfo fileInfo, string keywords) { ListViewItem lvi = new ListViewItem();//文件项 lvi.Tag = fileInfo.FullName; lvi.Text = fileInfo.Name; lvi.ImageIndex = imgLarge.Images.Count - 1; if (keywords != "" && (!lvi.Text.Contains(keywords))) { return;//搜索不到关键字,不将文件添加到ListView中显示 } //文件的名称属性项 lvi.SubItems[0].Tag = lvi.Tag; lvi.SubItems[0].Text = lvi.Text; //文件大小属性项 ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem(); lvsi.Tag = fileInfo.Length; lvsi.Text = fileInfo.Length / 1024 + " KB"; lvi.SubItems.Add(lvsi); //修改日期属性项 lvsi = new ListViewItem.ListViewSubItem(); lvsi.Tag = fileInfo.LastAccessTime.ToString(); lvsi.Text = fileInfo.LastAccessTime.ToString(); lvi.SubItems.Add(lvsi); //添加文件 this.lvwData.Items.Add(lvi); } /// <summary> /// 将文件夹添加到ListView中显示 /// </summary> /// <param name="DirectoryInfo">文件夹</param> /// <param name="keywords">搜索关键字</param> private void AddFolderToListView(DirectoryInfo DirectoryInfo, string keywords) { ListViewItem lvi = new ListViewItem(); lvi.Tag = DirectoryInfo.FullName; lvi.Text = DirectoryInfo.Name;//显示名称 lvi.ImageIndex = 0; if (keywords != "" && (!lvi.Text.Contains(keywords))) { return;//搜索不到关键字,不将文件夹添加到ListView中显示 } // 文件夹的名称属性项 lvi.SubItems[0].Tag = lvi.Tag; lvi.SubItems[0].Text = lvi.Text; //文件夹大小属性项 ListViewItem.ListViewSubItem lvsi = new ListViewItem.ListViewSubItem(); lvsi.Tag = GetFolderSize(DirectoryInfo); lvsi.Text = FormatFolderSize(folderSize); folderSize = 0;//清零计算文件夹大小的变量 lvi.SubItems.Add(lvsi); //修改日期属性项 lvsi = new ListViewItem.ListViewSubItem(); lvsi.Tag = DirectoryInfo.LastAccessTime.ToString(); lvsi.Text = DirectoryInfo.LastAccessTime.ToString(); lvi.SubItems.Add(lvsi); //添加文件夹 this.lvwData.Items.Add(lvi); } /// <summary> /// 递归计算文件夹的大小 /// </summary> /// <param name="DirectoryInfo">文件夹</param> /// <returns>文件夹大小</returns> private long GetFolderSize(DirectoryInfo DirectoryInfo) { DirectoryInfo[] dirs = DirectoryInfo.GetDirectories(); FileInfo[] files = DirectoryInfo.GetFiles(); //是文件夹时,继续递归 if (dirs.Length > 0) { foreach (DirectoryInfo dir in dirs) { GetFolderSize(dir); } } //是文件时,进行累加计算 foreach (FileInfo fi in files) { folderSize = folderSize + fi.Length; } return folderSize; } /// <summary> /// 将文件夹大小转化为直观的文字显示 /// </summary> /// <param name="size">文件夹大小</param> /// <returns>文件夹大小的文字表示</returns> private string FormatFolderSize(long size) { if ((size >> 20) > 0) { //保留两位小数 return ((size >> 10) / 1024.0).ToString("F2") + " MB"; } else { return (size >> 10) + " KB"; } } /// <summary> /// 为listview添加列标题 /// </summary> private void AddHeaderToListView(ListView listView) { ColumnHeader ch = new ColumnHeader(); ch.Text = "文件名"; ch.Width = 120; listView.Columns.Add(ch); ch = new ColumnHeader(); ch.Width = 70; ch.Text = "大小"; listView.Columns.Add(ch); ch = new ColumnHeader(); ch.Text = "修改日期"; ch.Width = 140; listView.Columns.Add(ch); } #endregion #region 经常使用的公共方法 /// <summary> /// 获取文件后缀名(小写) /// </summary> /// <param name="path">文件全路径或文件名</param> public string GetSuffixName(string path) { string suffix = string.Empty; if (path.Contains(".")) { suffix = path.Substring(path.LastIndexOf(".") + 1);//后缀名 } return suffix.ToLower(); } /// <summary> /// 获取应用程序根路径 /// </summary> public static string GetApplicationPath() { string path = Application.StartupPath; string folderName = String.Empty; while (folderName.ToLower() != "bin") { path = path.Substring(0, path.LastIndexOf("\\")); folderName = path.Substring(path.LastIndexOf("\\") + 1); } return path.Substring(0, path.LastIndexOf("\\") + 1); } #endregion } }