zoukankan      html  css  js  c++  java
  • winform:简单文件资源管理器

    今天全部学习内容的体现就是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:本文不是教程,控件属性内容请自行脑补 。

  • 相关阅读:
    MaskRCNN模型解读
    Centos7下WebLogic安装部署
    CentOS 7 安装 JAVA环境(JDK 1.8)
    Linux下如何查看tomcat是否安装、启动、文件路径、进程ID
    Nacos enable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
    多线程系列(三)之线程池
    多线程系列(二)之Thread类
    多线程系列(一)之多线程基础
    Vue2/Vue3 自定义组件库
    EF Core使用单独的项目管理迁移
  • 原文地址:https://www.cnblogs.com/zeusro/p/3422264.html
Copyright © 2011-2022 走看看