Winform中实现批量文件复制(附代码下载)
时间:2019-12-12
本文章向大家介绍Winform中实现批量文件复制(附代码下载),主要包括Winform中实现批量文件复制(附代码下载)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
场景
效果
将要批量复制的文件拖拽到窗体中,然后点击下边选择目标文件夹,然后点击复制按钮。
注:
博客主页:
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
原文地址:https://www.cnblogs.com/badaoliumangqizhi/p/12029056.html
- MyBatis-从查询昨天的数据说起
- WCF并发(Concurrency)的本质:同一个服务实例上下文(InstanceContext)同时处理多个服务调用请求
- Spring集成RabbitMQ-必须知道的几个概念
- Spring读书笔记——bean创建(上)
- 15:21爆出的小程序功能升级,你还要对小程序观望吗?
- 如何解决分布式系统中的跨时区问题[原理篇]
- 什么是区块链:块的结构
- Spring读书笔记——bean创建(下)
- 当区块链遇上传统行业 我们的生活和工作会改变吗?
- 如何设计开发好一个 HTTP API?
- [WCF权限控制]基于Windows用户组的授权方式[下篇]
- Spring读书笔记——bean解析
- 10个大数据误区,看看你中了几个?
- 从数据到代码——通过代码生成机制实现强类型编程[上篇]
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 同样的GitHub包你就下载失败
- Linux编译C++
- 聊聊dubbo-go的tracingFilter
- JDBC - 第一天
- JavaSE - 排序算法
- JavaSE - 多态的本质
- Result Maps collection does not contain value for XXX 错误
- 当端口被占用如何kill占用端口的进程
- 将本地仓库同步到Github上的远程仓库
- 毫不留情地揭开 ArrayList 和 LinkedList 之间的神秘面纱
- 关于void QProcess::start参数问题的解决
- Python格式化输出
- 多线程 - 生产者消费者模式
- TCP的三次握手和四次挥手
- Springboot异常处理