场景

效果

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

注:

博客主页:
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 - , 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[]);
}
  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 = ;
string DName = "";
if (textBox1.Text.Length > && listView1.Items.Count > )
{
try
{
for (int i = ; i < listView1.Items.Count; i++)
{
FileName = listView1.Items[i].SubItems[].Text;
tem_n = FileName.LastIndexOf("\\");
FileName = FileName.Substring(tem_n + , FileName.Length - tem_n - );
DName = textBox1.Text.Trim() + "\\" + FileName;
CopyFile(listView1.Items[i].SubItems[].Text, DName, );
this.Text = "复制:" + listView1.Items[i].SubItems[].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 = ; //记录传输的大小
while (copied <= ((int)FormerOpen.Length - SectSize)) //拷贝主体部分
{
FileSize = FormerOpen.Read(buffer, , SectSize); //从0开始读,每次最大读SectSize
FormerOpen.Flush(); //清空缓存
ToFileOpen.Write(buffer, , SectSize); //向目的文件写入字节
ToFileOpen.Flush(); //清空缓存
ToFileOpen.Position = FormerOpen.Position; //使源文件和目的文件流的位置相同
copied += FileSize; //记录已拷贝的大小
}
int left = (int)FormerOpen.Length - copied; //获取剩余大小
FileSize = FormerOpen.Read(buffer, , left); //读取剩余的字节
FormerOpen.Flush(); //清空缓存
ToFileOpen.Write(buffer, , left); //写入剩余的部分
ToFileOpen.Flush(); //清空缓存
}
//如果整体拷贝,即每次拷贝内容大于文件总长度
else
{
byte[] buffer = new byte[FormerOpen.Length]; //获取文件的大小
FormerOpen.Read(buffer, , (int)FormerOpen.Length); //读取源文件的字节
FormerOpen.Flush(); //清空缓存
ToFileOpen.Write(buffer, , (int)FormerOpen.Length); //写放字节
ToFileOpen.Flush(); //清空缓存
}
FormerOpen.Close(); //释放所有资源
ToFileOpen.Close(); //释放所有资源
}

代码下载

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

Winform中实现批量文件复制(附代码下载)的更多相关文章

  1. Winform中实现拖拽文件到ListView获取文件类型(附代码下载)

    场景 效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建一个for ...

  2. 在winform中调用js文件并输出结果

    在winform中调用js文件并输出结果默认分类 2007-10-19 16:35:06 阅读25 评论0 字号:大中小 由于项目需要在winform中调一个强大的js,所以把这个tip记录在此: 1 ...

  3. (转)在WinForm中选择本地文件

    相信很多朋友在日常的编程中总会遇到各钟各样的问题,关于在WinForm中选择本地文件就是很多朋友们都认为很难的一个学习.net的难点, 在WebForm中提供了FileUpload控件来供我们选择本地 ...

  4. 【.Net】在WinForm中选择本地文件

    相信很多朋友在日常的编程中总会遇到各钟各样的问题,关于在WinForm中选择本地文件就是很多朋友们都认为很难的一个学习.net的难点, 在WebForm中提供了FileUpload控件来供我们选择本地 ...

  5. C#和Java中执行SQL文件脚本的代码(非常有用)

    原文:C#和Java中执行SQL文件脚本的代码(非常有用) 我们在做程序的时候有事后会涉及到利用sql文件 直接执行,可是在sql文件中有很多注释,我们要一句一句的执行首先必须的得把sql文件解析 去 ...

  6. 读取web工程中.properties资源文件的模板代码

    读取web工程中.properties资源文件的模板代码 // 读取web工程中.properties资源文件的模板代码 private void test2() throws IOException ...

  7. JPA中实现双向多对多的关联关系(附代码下载)

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  8. 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

    一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...

  9. Dubbo与SpringBoot整合流程(从实例入手,附代码下载)

    场景 Dubbo环境搭建-管理控制台dubbo-admin实现服务监控: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10362 ...

随机推荐

  1. 用Helm3构建多层微服务

    Helm是一款非常流行的k8s包管理工具.以前就一直想用它,但看到它产生的文件比k8s要复杂许多,就一直犹豫,不知道它的好处能不能抵消掉它的复杂度.但如果不用,而是用Kubectl来进行调式真的很麻烦 ...

  2. ReactRouter中HashRouter和BrowserRouter的区别

    仅个人理解,如有不当请指正 一.从原理上 HashRouter在路径中包含了#,相当于HTML的锚点定位.(# 符号的英文叫hash,所以叫HashRouter,和散列没关系哦)) 而BrowserR ...

  3. CSS中如果实现元素浮动和清除浮动,看这篇文章就足够了

    浮动基本介绍 在标准文档流中元素分为2种,块级元素和行内元素,如果想让一些元素既要有块级元素的特点也同时保留行内元素特点,只能让这些元素脱离标准文档流即可. 浮动可以让元素脱离标准文档流,可以实现让多 ...

  4. Kibana笔记

    • 根据id查询 GET index_1/doc/1 • 全文检索 GET index_1/doc/_search GET index_1/doc/_search{ "query" ...

  5. 转载:不是书评 :《我是一只IT小小鸟》

    本文转载自刘未鹏博客:http://www.mindhacks.cn. 原文地址如下:http://mindhacks.cn/2009/10/05/im-a-tiny-bird-book-review ...

  6. Android多线程之(一)View.post()源码分析——在子线程中更新UI

    提起View.post(),相信不少童鞋一点都不陌生,它用得最多的有两个功能,使用简便而且实用: 1)在子线程中更新UI.从子线程中切换到主线程更新UI,不需要额外new一个Handler实例来实现. ...

  7. 全栈项目|小书架|微信小程序-实现搜索功能

    效果图 上图是小程序端实现的搜索功能效果图. 从图中可以看出点击首页搜索按钮即可进入搜索页面. 布局样式是:搜索框 + 热搜内容 + 搜索列表. 搜索框使用 lin-ui 中的 Searchbar组件 ...

  8. Spring通过IOC帮我们做火鸡

    一.IOC--setter注入 1.准备dmo 首先准备一只火鸡 public class Turkey { private int id; private String name; public i ...

  9. 如何在Android手机上进行自动化测试(上)

    版权声明:允许转载,但转载必须保留原链接:请勿用作商业或者非法用途 前言 通过阅读本节教程,你将了解到以下内容: 如何在脚本代码中.运行脚本时指定手机 如何填写--device Android:/// ...

  10. Cisco 7200 路由 PPPOE 拨号详解

    1.1配置虚拟拨号接口 R1(config)#vpdn enable                  #启用vpdn虚拟专用拨号网络 R1(config)#interface dialer 1    ...