欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Winform中实现批量文件复制(附代码下载)

程序员文章站 2022-04-14 19:40:02
场景 效果 将要批量复制的文件拖拽到窗体中,然后点击下边选择目标文件夹,然后点击复制按钮。 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。 实现 新建一个窗体,布局设计如下 上面 ......

场景

效果

Winform中实现批量文件复制(附代码下载)

 

 

Winform中实现批量文件复制(附代码下载)

将要批量复制的文件拖拽到窗体中,然后点击下边选择目标文件夹,然后点击复制按钮。

Winform中实现批量文件复制(附代码下载)

 

 

Winform中实现批量文件复制(附代码下载)

注:

博客主页:

关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。

实现

新建一个窗体,布局设计如下

上面是一个listview,下面是textbox和两个button,然后添加一个路径选择控件。

Winform中实现批量文件复制(附代码下载)

 

 

在窗体的load事件中对listview进行样式设置

 private void form1_load(object sender, eventargs e)
        {
            listview1.gridlines = true;//在各数据之间形成网格线
            listview1.view = view.details;//显示列名称
            listview1.fullrowselect = true;//在单击某项时,对其进行选中
            listview1.headerstyle = columnheaderstyle.nonclickable;//隐藏列标题
            listview1.columns.add("文件路径", listview1.width - 5, horizontalalignment.right);
        }

 

然后编写listview的脱拽事件,使其能获取到拖拽文件并显示

private void listview1_dragenter(object sender, drageventargs e)
        {
            e.effect = dragdropeffects.copy;       //设置拖放操作中目标放置类型为复制
            string[] str_drop = (string[])e.data.getdata(dataformats.filedrop, true);//检索数据格式相关联的数据
            data_list(listview1, str_drop[0]);
        }
  public void data_list(listview lv, string f)  //form或mouseeventargs添加命名空间using system.windows.forms;
        {
            listviewitem item = new listviewitem(f);
            lv.items.add(item);
        }

 

然后编写三个点按钮的点击事件,使其打开路径选择对话框,并将选择的路径显示在textbox中。

private void button2_click(object sender, eventargs e)
        {
            if (folderbrowserdialog1.showdialog() == dialogresult.ok)
            {
                textbox1.text = folderbrowserdialog1.selectedpath;
            }
        }

 

然后编写复制按钮的点击事件

private void button1_click(object sender, eventargs e)
        {
            string filename = "";
            int tem_n = 0;
            string dname = "";
            if (textbox1.text.length > 0 && listview1.items.count > 0)
            {
                try
                {
                    for (int i = 0; i < listview1.items.count; i++)
                    {
                        filename = listview1.items[i].subitems[0].text;
                        tem_n = filename.lastindexof("\\");
                        filename = filename.substring(tem_n + 1, filename.length - tem_n - 1);
                        dname = textbox1.text.trim() + "\\" + filename;
                        copyfile(listview1.items[i].subitems[0].text, dname, 1024);
                        this.text = "复制:" + listview1.items[i].subitems[0].text;
                    }
                    messagebox.show("文件批量复制完成。");
                }
                catch
                {
                    messagebox.show("文件复制错误。");
                }
            }
        }

 

在复制按钮的点击事件中执行复制文件的方法copyfile

filestream formeropen;
        filestream tofileopen;
        /// <summary>
        /// 文件的复制
        /// </summary>
        /// <param formerfile="string">源文件路径</param>
        /// <param tofile="string">目的文件路径</param> 
        /// <param sectsize="int">传输大小</param> 
        /// <param progressbar="progressbar">progressbar控件</param> 
        public void copyfile(string formerfile, string tofile, int sectsize)
        {
            filestream filetocreate = new filestream(tofile, filemode.create);  //创建目的文件,如果已存在将被覆盖
            filetocreate.close();          //关闭所有资源
            filetocreate.dispose();          //释放所有资源
            formeropen = new filestream(formerfile, filemode.open, fileaccess.read);//以只读方式打开源文件
            tofileopen = new filestream(tofile, filemode.append, fileaccess.write); //以写方式打开目的文件
            //根据一次传输的大小,计算传输的个数
            //int max = convert.toint32(math.ceiling((double)formeropen.length / (double)sectsize));

            int filesize;            //要拷贝的文件的大小
            //如果分段拷贝,即每次拷贝内容小于文件总长度
            if (sectsize < formeropen.length)
            {
                byte[] buffer = new byte[sectsize];       //根据传输的大小,定义一个字节数组
                int copied = 0;          //记录传输的大小
                while (copied <= ((int)formeropen.length - sectsize))   //拷贝主体部分
                {
                    filesize = formeropen.read(buffer, 0, sectsize);   //从0开始读,每次最大读sectsize
                    formeropen.flush();        //清空缓存
                    tofileopen.write(buffer, 0, sectsize);     //向目的文件写入字节
                    tofileopen.flush();         //清空缓存
                    tofileopen.position = formeropen.position;    //使源文件和目的文件流的位置相同
                    copied += filesize;         //记录已拷贝的大小
                }
                int left = (int)formeropen.length - copied;      //获取剩余大小
                filesize = formeropen.read(buffer, 0, left);     //读取剩余的字节
                formeropen.flush();         //清空缓存
                tofileopen.write(buffer, 0, left);       //写入剩余的部分
                tofileopen.flush();         //清空缓存
            }
            //如果整体拷贝,即每次拷贝内容大于文件总长度
            else
            {
                byte[] buffer = new byte[formeropen.length];    //获取文件的大小
                formeropen.read(buffer, 0, (int)formeropen.length);   //读取源文件的字节
                formeropen.flush();         //清空缓存
                tofileopen.write(buffer, 0, (int)formeropen.length);   //写放字节
                tofileopen.flush();         //清空缓存
            }
            formeropen.close();          //释放所有资源
            tofileopen.close();          //释放所有资源
        }

 

代码下载

https://download.csdn.net/download/badao_liumang_qizhi/12028246