今天全部学习内容的体现就是winform的资源管理器。这个资源管理器主要由一个textbox获取路径,然后在treeview那里通过递归的方式呈现目录树,当用户点击treeview的节点是,会触发AfterSelect事件加载子节点,然后在listview那里呈现对应目录下的文件。而当用户点击listview的一些文件时,如果是txt文件的话,会根据默认编码在下面的textbox里显示其内容。其他的按钮主要是一些简单的IO操作。
难点在于递归的理解以及运用。
以下是各种事件处理
#region 选择路径 -void txtPath_Click(object sender, EventArgs e)
/// <summary>
/// 选择路径
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtPath_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK)
{
txtPath.Text = fbd.SelectedPath;
//打开目录对话框所选择的路径是 SelectedPath
}
}
#endregion
/// 选择路径
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtPath_Click(object sender, EventArgs e)
{
FolderBrowserDialog fbd = new FolderBrowserDialog();
if (fbd.ShowDialog() == DialogResult.OK)
{
txtPath.Text = fbd.SelectedPath;
//打开目录对话框所选择的路径是 SelectedPath
}
}
#endregion
#region 获取指定目录子目录和子文件 -void btnGetPath_Click(object sender, EventArgs e)
/// <summary>
/// 获取指定目录子目录和子文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGetPath_Click(object sender, EventArgs e)
{
tvDir.Nodes.Clear();
//1.获取指定目录下所有子目录
//第一个参数是指查找的目录 第二个参数是指查询匹配项,*代表所有内容, 第三个参数代码查找的位置,默认只是查找指定的目录下面的内容,我们还可以设置查找子目录的子目录。。。。。
//string[] dirs = Directory.GetDirectories(txtPath.Text, "*o*", SearchOption.TopDirectoryOnly);
if (txtPath.Text.Trim().Length == 0)
{
return;
}
else
{
LoadData(txtPath.Text, null);
LoadFiles(txtPath.Text);
}
}
#endregion
/// 获取指定目录子目录和子文件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btnGetPath_Click(object sender, EventArgs e)
{
tvDir.Nodes.Clear();
//1.获取指定目录下所有子目录
//第一个参数是指查找的目录 第二个参数是指查询匹配项,*代表所有内容, 第三个参数代码查找的位置,默认只是查找指定的目录下面的内容,我们还可以设置查找子目录的子目录。。。。。
//string[] dirs = Directory.GetDirectories(txtPath.Text, "*o*", SearchOption.TopDirectoryOnly);
if (txtPath.Text.Trim().Length == 0)
{
return;
}
else
{
LoadData(txtPath.Text, null);
LoadFiles(txtPath.Text);
}
}
#endregion
#region 树控件节点点击之后触发 -void tvDir_AfterSelect(object sender, TreeViewEventArgs e)
/// <summary>
/// 树控件节点点击之后触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tvDir_AfterSelect(object sender, TreeViewEventArgs e)
{
//获取当前所选择的节点
TreeNode node = this.tvDir.SelectedNode;
if (node == null) //判断有没有选择某一个节点
{
return;
}
//再将之前存储到Tag值的全路径取出来使用
string path = node.Tag.ToString();
//使用实例类来实现目录和文件的获取
//1.获取目录
LoadData(path, node);
LoadFiles(path);
}
#endregion
/// 树控件节点点击之后触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tvDir_AfterSelect(object sender, TreeViewEventArgs e)
{
//获取当前所选择的节点
TreeNode node = this.tvDir.SelectedNode;
if (node == null) //判断有没有选择某一个节点
{
return;
}
//再将之前存储到Tag值的全路径取出来使用
string path = node.Tag.ToString();
//使用实例类来实现目录和文件的获取
//1.获取目录
LoadData(path, node);
LoadFiles(path);
}
#endregion
#region 单击文件,显示文件内容 - void lvList_Click(object sender, EventArgs e)
/// <summary>
/// 单击文件,显示文件内容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lvList_Click(object sender, EventArgs e)
{
string path = this.lvList.SelectedItems[0].Tag.ToString();
if (Path.GetExtension(path) == ".txt" || Path.GetExtension(path) == ".cs")
{
string str = File.ReadAllText(path, Encoding.Default);
//string[] str = File.ReadAllLines(path, Encoding.Default);
this.txtContent.Text = str;
}
}
#endregion
/// 单击文件,显示文件内容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void lvList_Click(object sender, EventArgs e)
{
string path = this.lvList.SelectedItems[0].Tag.ToString();
if (Path.GetExtension(path) == ".txt" || Path.GetExtension(path) == ".cs")
{
string str = File.ReadAllText(path, Encoding.Default);
//string[] str = File.ReadAllLines(path, Encoding.Default);
this.txtContent.Text = str;
}
}
#endregion
#region 加载树节点和listview控件的项 - void LoadData(string path, TreeNode parentNode)
/// <summary>
/// 加载树节点和listview控件的项
/// </summary>
/// <param name="path"></param>
/// <param name="parentNode"></param>
void LoadData(string path, TreeNode parentNode)
{
//tvDir.Nodes.Clear();
if (path.Trim().Length == 0)
{
MessageBox.Show("路径为空");
return;
}
else
{
DirectoryInfo dir = new DirectoryInfo(path);
DirectoryInfo[] dirs = dir.GetDirectories();
//将得到的目录生成为树节点添加给刚刚点击的节点对象
foreach (DirectoryInfo d in dirs)
{
TreeNode subNode = new TreeNode(d.Name); //目录名称
subNode.Tag = d.FullName; //全路径
//任何一个节点都会有一个了节点集合
if (parentNode == null) //为null说明当前是为树的根节点添加
{
tvDir.Nodes.Add(subNode);
}
else
{
parentNode.Nodes.Add(subNode); //第一个不一样的地方
}
/*递归的特点:方法调用方法本身
* 1.递归在保证有结束的时候
* 2.递归的操作是类似一样的,但是执行的次数却不确定
*/
//加载一个目录,立刻来加载它的子目录
LoadData(subNode.Tag.ToString(), subNode);
}
}
}
#endregion
/// 加载树节点和listview控件的项
/// </summary>
/// <param name="path"></param>
/// <param name="parentNode"></param>
void LoadData(string path, TreeNode parentNode)
{
//tvDir.Nodes.Clear();
if (path.Trim().Length == 0)
{
MessageBox.Show("路径为空");
return;
}
else
{
DirectoryInfo dir = new DirectoryInfo(path);
DirectoryInfo[] dirs = dir.GetDirectories();
//将得到的目录生成为树节点添加给刚刚点击的节点对象
foreach (DirectoryInfo d in dirs)
{
TreeNode subNode = new TreeNode(d.Name); //目录名称
subNode.Tag = d.FullName; //全路径
//任何一个节点都会有一个了节点集合
if (parentNode == null) //为null说明当前是为树的根节点添加
{
tvDir.Nodes.Add(subNode);
}
else
{
parentNode.Nodes.Add(subNode); //第一个不一样的地方
}
/*递归的特点:方法调用方法本身
* 1.递归在保证有结束的时候
* 2.递归的操作是类似一样的,但是执行的次数却不确定
*/
//加载一个目录,立刻来加载它的子目录
LoadData(subNode.Tag.ToString(), subNode);
}
}
}
#endregion
#region 加载文件 ListView- void LoadFiles(string path)
/// <summary>
/// 加载文件
/// </summary>
/// <param name="path"></param>
void LoadFiles(string path)
{
DirectoryInfo dir = new DirectoryInfo(path);
this.tvDir.ExpandAll();
this.lvList.Items.Clear();
//获取子文件
FileInfo[] myFiles = dir.GetFiles();
foreach (FileInfo f in myFiles)
{
//1.添加主项
ListViewItem lv = new ListViewItem(f.Name);
//为主项添加子项
lv.SubItems.AddRange(new string[] { f.Extension, (f.Length / 1024).ToString() + "KB", f.FullName });
lv.Tag = f.FullName;
this.lvList.Items.Add(lv);
}
}
#endregion
/// 加载文件
/// </summary>
/// <param name="path"></param>
void LoadFiles(string path)
{
DirectoryInfo dir = new DirectoryInfo(path);
this.tvDir.ExpandAll();
this.lvList.Items.Clear();
//获取子文件
FileInfo[] myFiles = dir.GetFiles();
foreach (FileInfo f in myFiles)
{
//1.添加主项
ListViewItem lv = new ListViewItem(f.Name);
//为主项添加子项
lv.SubItems.AddRange(new string[] { f.Extension, (f.Length / 1024).ToString() + "KB", f.FullName });
lv.Tag = f.FullName;
this.lvList.Items.Add(lv);
}
}
#endregion
#region 复制按钮
private void btnCopy_Click(object sender, EventArgs e)
{
if (this.lvList.SelectedItems.Count == 0)
{
return;
}
FolderBrowserDialog f = new FolderBrowserDialog();
string desPath = "";
if (f.ShowDialog() == DialogResult.OK)
{
desPath = f.SelectedPath;
}
//string path = this.lvList.SelectedItems[0].Tag.ToString();
string path = this.lvList.SelectedItems[0].SubItems[3].Text;
//两个参数都是全路径 文件夹+文件名
if (File.Exists(Path.Combine(desPath, this.lvList.SelectedItems[0].Text)))
{
MessageBox.Show("文件已经存在");
return;
}
else
{
File.Copy(path, Path.Combine(desPath, this.lvList.SelectedItems[0].Text));
MessageBox.Show("ok");
}
}
#endregion
#region 移动按钮
private void btnMove_Click(object sender, EventArgs e)
{
if (this.lvList.SelectedItems.Count == 0)
{
return;
}
FolderBrowserDialog f = new FolderBrowserDialog();
//用来储存打开对话框的路径
string desPath = "";
if (f.ShowDialog() == DialogResult.OK)
{
desPath = f.SelectedPath;
}
string path = this.lvList.SelectedItems[0].SubItems[3].Text;
//两个参数都是全路径 文件夹+文件名
File.Move(path, Path.Combine(desPath, this.lvList.SelectedItems[0].Text));
int index = this.lvList.SelectedItems[0].Index; //得到当前选择项的行索引
this.lvList.Items.RemoveAt(index);
MessageBox.Show("ok");
}
#endregion
#region 创建按钮
private void btnCreate_Click(object sender, EventArgs e)
{
File.Create(txtPath.Text.Trim());
}
#endregion
#region 删除按钮
private void btnDelete_Click(object sender, EventArgs e)
{
if (this.lvList.SelectedItems.Count == 0)
{
return;
}
string path = this.lvList.SelectedItems[0].SubItems[3].Text;
if (MessageBox.Show("是否真的想删除?", "操作提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
File.Delete(path);
int index = this.lvList.SelectedItems[0].Index; //得到当前选择项的行索引
this.lvList.Items.RemoveAt(index);
MessageBox.Show("ok");
}
}
#endregion
#region 退出
private void button1_Click(object sender, EventArgs e)
{
Application.Exit();
}
private void btnCopy_Click(object sender, EventArgs e)
{
if (this.lvList.SelectedItems.Count == 0)
{
return;
}
FolderBrowserDialog f = new FolderBrowserDialog();
string desPath = "";
if (f.ShowDialog() == DialogResult.OK)
{
desPath = f.SelectedPath;
}
//string path = this.lvList.SelectedItems[0].Tag.ToString();
string path = this.lvList.SelectedItems[0].SubItems[3].Text;
//两个参数都是全路径 文件夹+文件名
if (File.Exists(Path.Combine(desPath, this.lvList.SelectedItems[0].Text)))
{
MessageBox.Show("文件已经存在");
return;
}
else
{
File.Copy(path, Path.Combine(desPath, this.lvList.SelectedItems[0].Text));
MessageBox.Show("ok");
}
}
#endregion
#region 移动按钮
private void btnMove_Click(object sender, EventArgs e)
{
if (this.lvList.SelectedItems.Count == 0)
{
return;
}
FolderBrowserDialog f = new FolderBrowserDialog();
//用来储存打开对话框的路径
string desPath = "";
if (f.ShowDialog() == DialogResult.OK)
{
desPath = f.SelectedPath;
}
string path = this.lvList.SelectedItems[0].SubItems[3].Text;
//两个参数都是全路径 文件夹+文件名
File.Move(path, Path.Combine(desPath, this.lvList.SelectedItems[0].Text));
int index = this.lvList.SelectedItems[0].Index; //得到当前选择项的行索引
this.lvList.Items.RemoveAt(index);
MessageBox.Show("ok");
}
#endregion
#region 创建按钮
private void btnCreate_Click(object sender, EventArgs e)
{
File.Create(txtPath.Text.Trim());
}
#endregion
#region 删除按钮
private void btnDelete_Click(object sender, EventArgs e)
{
if (this.lvList.SelectedItems.Count == 0)
{
return;
}
string path = this.lvList.SelectedItems[0].SubItems[3].Text;
if (MessageBox.Show("是否真的想删除?", "操作提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.Yes)
{
File.Delete(path);
int index = this.lvList.SelectedItems[0].Index; //得到当前选择项的行索引
this.lvList.Items.RemoveAt(index);
MessageBox.Show("ok");
}
}
#endregion
#region 退出
private void button1_Click(object sender, EventArgs e)
{
Application.Exit();
}
#endregion
最后贴个删除的效果图:
PS:本文不是教程,控件属性内容请自行脑补 。