场景
效果
将要批量复制的文件拖拽到窗体中,然后点击下边选择目标文件夹,然后点击复制按钮。
注:
博客主页:
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; ////// 文件的复制 /// /// 源文件路径 /// 目的文件路径 /// 传输大小 /// ProgressBar控件 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