主界面是这样的

1.在点击查询引发的事件时把TextBox.Text输入的目录地址加载到TreeList控件里。

private void btnSelect_Click(object sender, EventArgs e)
{
//避免重复加载
tv.Nodes.Clear();
////Load事件手动添加根节点
TreeNode tn = new TreeNode();
tn.Text = tbxName.Text;//根节点名字;
tn.Tag = tbxName.Text;//根节点物理地址;

tv.Nodes.Add(tn);
}

2.写一个加载当前节点所有文件夹的方法

DirectoryInfo info; //先创建一个文件夹对象

public void LoadDirectory(TreeNode selectNode)
{
  //每次点击事件后选中节点的子节点会重复加载,所以需要先清空
  selectNode.Nodes.Clear();
  //把选中节点文件的地址传给path;
  string path = selectNode.Tag.ToString();
  //把想要的文件夹信息传给info
  info = new DirectoryInfo(path);
  //当前目录的子目录对象数组
  DirectoryInfo[] direct;
  try
  {
    direct = info.GetDirectories();
    foreach (DirectoryInfo item in direct)//遍历子目录数组
    {
      TreeNode tn = new TreeNode();
      tn.Text = item.Name;
      tn.Tag = item.FullName;//文件夹的物理路径
      selectNode.Nodes.Add(tn);
    }
  }
  catch (Exception ex)
  {
    MessageBox.Show(ex.ToString());
  }
}

3.选中节点的时候展开文件夹目录,然后ListView控件里还得展示选中节点文件夹里的所有文件,还得写一个加载当前节点的所有文件的方法

public void LoadAllFiles()
{
  lv.Items.Clear();//因为每选中一次都会触发事件,会重复加载,所以先清空listview控件

  try
  {
    FileInfo[] files = info.GetFiles();//创建一个文件的数组
    foreach (FileInfo item in files)//遍历文件数组给Listview绑定值
    {
      ListViewItem lvitem = new ListViewItem(item.Name);
      lvitem.SubItems.Add(item.Length * 1.0 / 1024 + "KB");
      lvitem.SubItems.Add(item.Extension);
      lvitem.SubItems.Add(item.FullName);
      lv.Items.Add(lvitem);
    }
  }
  catch (Exception a)
  {
    MessageBox.Show("系统文件,禁止访问!");//有的文件是系统文件不会让访问的!
  }
}

3.点击TreeView事件后调用加载当前节点所有文件夹的方法和加载当前节点的所有文件的方法
private void tv_AfterSelect(object sender, TreeViewEventArgs e)
{
  TreeNode selectNode = tv.SelectedNode;
  LoadDirectory(selectNode);
  LoadAllFiles();
}

另外还有其他的一些事件和方法:

双击ListView打开选中文件的方法

//打开文件
private void lv_DoubleClick(object sender, EventArgs e)
{
  string path = lv.SelectedItems[0].SubItems[3].Text;
  Process.Start(path);//用此方法打开文件
}

//选中ListView文件右键点击复制的方法
private void tsmiCopy_Click(object sender, EventArgs e)
{
  if (this.lv.SelectedItems.Count == 0)
  {
    return;
  }
  FolderBrowserDialog fbd = new FolderBrowserDialog();//FolderBrowserDialog,文件夹浏览器对话, 提示用户选择文件夹
  DialogResult result = fbd.ShowDialog();
  string path=lv.SelectedItems[0].SubItems[3].Text;
  string despath=null;
  if (result == DialogResult.OK)
  {
    despath = fbd.SelectedPath;//获取当前用户选择的路径
    despath += lv.SelectedItems[0].SubItems[0].Text;
    File.Copy(path, despath,true);
    MessageBox.Show("复制成功!");
  }

}

删除ListView选中文件的方法:

private void tsmiDelete_Click(object sender, EventArgs e)
{

  if (this.lv.SelectedItems.Count == 0)
  {
  return;
  }
  DialogResult result= MessageBox.Show("确定删除么?", "系统提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Asterisk);
  string path=lv.SelectedItems[0].SubItems[3].Text;
  if (result == DialogResult.OK)
  {
  File.Delete(path);
  }
  LoadAllFiles();//删除后重新加载ListView控件绑定的值
}

移动的方法:

private void tsmiMove_Click(object sender, EventArgs e)
{
  if (this.lv.SelectedItems.Count == 0)
  {
    return;
  }
  FolderBrowserDialog fbd = new FolderBrowserDialog();
  DialogResult result = fbd.ShowDialog();
  string path = lv.SelectedItems[0].SubItems[3].Text;
  string despath = null;
  if (result == DialogResult.OK)
  {
    despath = fbd.SelectedPath;
    despath += lv.SelectedItems[0].SubItems[0].Text;//新路径必须拼接,此处拼接有误,回头再改!
    File.Move(path, despath);
    MessageBox.Show("移动成功!");
  }
}

还有一个复制文件夹的方法,由于文件夹下可能有子文件夹或者文件,不好区分,方法有些复杂,借用一下老师的代码:

private void CopyDirectory(string srcdir, string desdir)//第一个参数是原路径,第二个参数是新路径
{
  string folderName = srcdir.Substring(srcdir.LastIndexOf("\\") + 1);

  string desfolderdir = desdir +"\\"+ folderName;

  string[] filenames = Directory.GetFileSystemEntries(srcdir);

  foreach (string file in filenames)// 遍历所有的文件和目录
  {
    if (Directory.Exists(file))// 先当作目录处理如果存在这个目录就递归Copy该目录下面的文件
    {

      string currentdir = desfolderdir + "\\" + file.Substring(file.LastIndexOf("\\") + 1);
      if (!Directory.Exists(currentdir))
      {
        Directory.CreateDirectory(currentdir);
      }

        CopyDirectory(file, desfolderdir);
     }

     else // 否则直接copy文件
     {
      string srcfileName = file.Substring(file.LastIndexOf("\\") + 1);

      srcfileName = desfolderdir + "\\" + srcfileName;

        if (!Directory.Exists(desfolderdir))
        {
          Directory.CreateDirectory(desfolderdir);
        }

        File.Copy(file, srcfileName);
      }
    }
  Directory.CreateDirectory(desfolderdir);
}

……………………………………………………………………………………………………………………………………………………………………………………………………………………

File类和Directory类都可以类名.出方法名,都是静态方法,由于File类的静态方法在使用时都会进行安全检查,所以如果想多次使用某个文件对象,可以考虑使用FileInfo类相应的实例方法。

FileInfo实例化后可以直接.Extension这个是文件扩展名部分的字符串也就是文件的类型字符串,不必像File类一样再拼接文件名得出后面的类型字符串了,很好用!

小项目:mini资源管理器【使用IO流:包含(Directory与DirectoryInfo、File与FileInfo的用法)】的更多相关文章

  1. 小型资源管理器,IO操作,读取和写入文件和目录的常用操作

    解决方案: 小总结: 用IO流,的file,DirectoryInfo的方法绑定Treeview控件上和删除,读取, 可以熟练掌握一下IO流 主页面: private void Form1_Load( ...

  2. [原创] Delphi小工具(Windows资源管理器右键菜单扩展)

    两个小工具 1. 项目临时文件清理 2. Android Ndk 编译 c/c++ jni 源码工具. 下载后,点击Reg.bat就可以完成注册安装.不需要时点击 UnReg.Bat 就可以删除菜单. ...

  3. java IO流之文件切割两例(含Properties 用法)

    package cn.itcast.io.p1.splitfile; import java.io.File;import java.io.FileInputStream;import java.io ...

  4. Java IO流学习总结二:File

    Java File类的功能非常强大,利用java基本上可以对文件进行所有操作.首先来看File类的构造函数的源码 /** * Internal constructor for already-norm ...

  5. Android小项目合集(经典教程)包含十五个Android开发应用实例

    http://www.cnblogs.com/aimeng/archive/2012/03/28/2422435.html

  6. 09、IO流—File类与IO流

    目录 一.File类 基本认识 实用方法 获取功能 重命名功能(包含剪切) 判断功能 创建.删除文件 实际小案例 二.IO流 1.认识IO流 2.IO流基类介绍 字节流基类介绍 字符流基类介绍 三.节 ...

  7. 【重学Java】IO流

    IO流的UML类图 File类 File类概述和构造方法[应用] File类介绍 它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于File而言,其封装的并不是一个真正存在 ...

  8. 史上最骚最全最详细的IO流教程,没有之一!

    目录 1.告白IO流的四点明确 2.File类 1.1 File概述 1.2 构造方法 1.3 常用方法 1.3.1 获取功能的方法 1.3.2 绝对路径和相对路径 1.3.3判断功能的方法 1.3. ...

  9. java IO流读取图片供前台显示

    最近项目中需要用到IO流来读取图片以提供前台页面展示,由于以前一直是用url路径的方式进行图片展示,一听说要项目要用IO流读取图片感觉好复杂一样,但任务下达下来了,做为程序员只有选择去执行喽,于是找了 ...

随机推荐

  1. 删除下标为n的数组值

    Array.prototype.del=function(n) { //n表示第几项,从0开始算起.//prototype为对象原型,注意这里为对象增加自定义方法的方法. if(n<0) //如 ...

  2. css 鼠标移动到按钮图片改变;图片换层;鼠标放上透明度改变直到隐藏;

    css 鼠标移动到按钮图片改变: 方法一: <style> .pp a { width:575px; height:157px; background:url(1.jpg);/*图片地址* ...

  3. Sql Server建立链接服务器访问Access的MDB数据库

    EXEC master.dbo.sp_addlinkedserver @server = N'test', @srvproduct=N'OLE DB Provider for Jet', @provi ...

  4. HBase的架构以及各个模块的功能

    一:整体架构 1.体系结构 2.物理模型 3.存储体系 regionserver->region->多个store(列簇)->一个memstore和多个storefile 4.HDF ...

  5. python 十进制 十六进制

    把十六进制的字串转为十进制数字:>>> print int('ff', 16)   255 把十进制数字转换为以十六进制表示之字串,可调用内置的hex()函数:>>> ...

  6. windows下Qt5.1.0配置android环境搭建 good

    1.首先下载好需要配置的软件: 1>Qt 5.1.0 for Android (Windows 32-bit, 716 MB)(Info)下载地址: http://qt-project.org/ ...

  7. 【Android开发学习笔记】【第三课】Activity和Intent

    首先来看一个Activity当中启动另一个Activity,直接上代码说吧: (1)首先要多个Activity,那么首先在res-layout下新建一个 Other.xml,用来充当第二个Activi ...

  8. H264关于RTP协议的实现

    完整的C/S架构的基于RTP/RTCP的H.264视频传输方案.此方案中,在服务器端和客户端分别进行了功能模块设计. 服务器端:RTP封装模块主要是对H.264码流进行打包封装:RTCP分析模块负责产 ...

  9. ubuntu下安装boost环境

    改自 http://blog.chinaunix.net/uid-12226757-id-3427282.html =============第一种: 也是最简单的:进入linux系统后,输入   # ...

  10. 微信公众平台开发(84) 小i机器人

    很多朋友询问如何开发小黄鸡之类的智能聊天机器人,但遗憾的是小黄鸡接口申请页面在最近几个月里都无法访问,且使用时限制太大,我们找了另一个接口:小i机器人.本文介绍如何在微信公众平台中使用小i接口开发智能 ...