y_0002.gif资源管理器的作用是,对计算机上的文件资源进行管理,对各种文件进行相应的需要操作。这里用C#实现了一个简单的资源管理器,可以讲所有文件和目录以树的形式显示在容器左侧,而容器右侧的是选择的某个文件或目录的属性,在右侧,我们科以通过双击文件来打开文件。主要熟悉对树的一些操作和对文件的操作。

public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }
       /// <summary>
       /// 浏览按钮的作用。提示用户选择要展示的路径然后经过判断用户的选择来确定后面的进程
       /// </summary>
       /// <param name="sender"></param>
       /// <param name="e"></param>
       private void btnBrowser_Click(object sender, EventArgs e)
       {
           FolderBrowserDialog fbd = new FolderBrowserDialog();
           DialogResult dr = fbd.ShowDialog();
           if (dr == DialogResult.Cancel)
           {
               return;
           }
           string path = fbd.SelectedPath;
           this.txtPath.Text = path;
           //将用户选择的目录以树的形式展示在TreeView中
           FillTreeView(path);
       }
       //填充树
       private void FillTreeView(string path)
       {
           //将最顶层的目录名添加到根节点
           DirectoryInfo di = new DirectoryInfo(path);
           TreeNode node = new TreeNode();
           node.Text = di.Name;
           node.Tag = di;//注意要去node的Tag属性并将di给这个属性
           this.tvViewLeft.Nodes.Add(node);
           //给di这个目录下添加子节点
           AddChildNodes(node, di);
       }
       //为当前的目录添加子节点
       private void AddChildNodes(TreeNode node, DirectoryInfo di)
       {
           foreach (DirectoryInfo temp in di.GetDirectories())
           {
               TreeNode tempNode = new TreeNode();//创建一个节点
               tempNode.Text = temp.Name;//将当前目录名作为子节点的名字
               tempNode.Tag = temp;
               node.Nodes.Add(tempNode);//添加一级子节点
               //这一步的嵌套调用,就可以实现为根目录下的一个子目录添加完所有的节点(包括子节点和孙子节点)
               AddChildNodes(tempNode, temp);//给当前的节点(子节点)添加子节点(二级子节点)
           }
       }
       private void tvViewLeft_AfterSelect(object sender, TreeViewEventArgs e)
       {
           //判断是否有选中的节点,如果有就用该节点(文件或目录)的属性填充右边的ListView下的项
           if (this.tvViewLeft.SelectedNode==null)
           {
               return ;
           }
           FillListView(this.tvViewLeft.SelectedNode.Tag as DirectoryInfo);
       }
       private void FillListView(DirectoryInfo di)
       {
           this.listViewRight.Items.Clear();//每次填充之前都将原来的数据清空
           foreach (DirectoryInfo temp in di.GetDirectories())
           {
               ListViewItem lvi = new ListViewItem();
               lvi.Text = temp.Name;//目录名
               lvi.SubItems.Add(temp.LastWriteTime.ToString());//大小
               lvi.SubItems.Add("文件夹");//文件类型
               lvi.SubItems.Add("");
               lvi.Tag = temp;//取得Tag属性
               this.listViewRight.Items.Add(lvi);
           }
           foreach (FileInfo temp in di.GetFiles())
           {
               ListViewItem lvi = new ListViewItem();
               lvi.Text = temp.Extension;//目录名
               lvi.SubItems.Add(temp.LastWriteTime.ToString());
               lvi.SubItems.Add("文件夹");//文件类型
               lvi.SubItems.Add(temp.Length.ToString());//大小
               lvi.Tag = temp;
               this.listViewRight.Items.Add(lvi);
           }
       }
       /// <summary>
       /// 处理双击事件
       /// </summary>
       /// <param name="sender">触发双击事件的控件</param>
       /// <param name="e"></param>
       private void listViewRight_DoubleClick(object sender, EventArgs e)
       {
           //如果没有选中的项就返回
           if (this.listViewRight.SelectedItems.Count==0)
           {
               return;
           }
           //如果选中项是目录,就调用FillListView方法用该目录下的子目录和文件来填充ListView下的项
           if (this.listViewRight.SelectedItems[0].Tag is DirectoryInfo)
           {
               FillListView(this.listViewRight.SelectedItems[0].Tag as DirectoryInfo);
           }
           //如果选中的是文件,就打开文件
           else
           {
               Process.Start((this.listViewRight.SelectedItems[0].Tag as FileInfo).FullName);
           }
       }
   }

后面再一一实现其他的各种操作。共同期待早日完成!。。。

看看结果:110334396.png

P.S:这里需要注意的是在添加节点的时候this.tvViewLeft.Nodes.Add(node);这里面的Nodes集合是所有根节点的集合。而node.Nodes.Add(tempNode);里面的Nodes集合是某个根节点下的所有一级子节点的集合。这里需要注意一下。

这里还用到了“容器”这个概念。这里用到的是SplitContainer容器,分为左右两部分,可以再属性那里设置这两部分的最小值。(PanelMinsize处设置)


j_0047.gif Ajax的姑娘,加油!j_0047.gif