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