今天全部学习内容的体现就是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

 

    #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

 

 

  #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

 

 #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

 

 

  #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

 

    #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

 

        #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();
        }
        

        #endregion 

 

最后贴个删除的效果图:

 

 

PS:本文不是教程,控件属性内容请自行脑补 。

 

 

 

 

 

 

posted on 2013-11-13 21:48  Cherbim  阅读(2503)  评论(0编辑  收藏  举报

这是页脚