场景

效果

 

 

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

 

 

注:

博客主页:

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

实现

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

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

 

 

在窗体的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