C#实现带进度条的文件复制功能
创作时间:
作者:
@小白创作中心
C#实现带进度条的文件复制功能
引用
1
来源
1.
https://www.zhangshengrong.com/p/On1vDWyNye/
本文将介绍如何使用C#实现一个带有进度条的文件复制功能。通过本文,读者可以学习到如何使用线程、进度条控件以及文件流操作等技术。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;
using System.Threading;
namespace CopyProgress015
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private Thread thdCopyFile; //创建一个线程
private string str = ""; //用来记录源文件的名字
FileStream FormerOpenStream; //实例化源文件FileStream类
FileStream ToFileOpenStream; //实例化目标文件FileStream类
#region //复制文件 函数
/// <summary>
/// 复制文件
/// </summary>
/// <param name="FormerFile">源文件路径</param>
/// <param name="ToFile">目的文件路径</param>
/// <param name="TranSize">传输大小</param>
/// <param name="progressBar1">ProgressBar控件</param>
public void CopyFile(string FormerFile, string ToFile, int TranSize, ProgressBar progressBar1)
{
progressBar1.Value = 0;//设置进度条的当前位置为0
progressBar1.Minimum = 0; //设置进度条的最小值为0
try
{
FormerOpenStream = new FileStream(FormerFile, FileMode.Open, FileAccess.Read);//以只读方式打开源文件
}
catch (IOException ex)
{
MessageBox.Show(ex.Message);
return;
}
try
{
FileStream fileToCreate = new FileStream(ToFile, FileMode.Create); //创建目的文件,如果已存在将被覆盖
fileToCreate.Close();//关闭所有fileToCreate的资源
fileToCreate.Dispose();//释放所有fileToCreate的资源
}
catch(IOException ex)
{
MessageBox.Show(ex.Message);
return;
}
ToFileOpenStream = new FileStream(ToFile, FileMode.Append, FileAccess.Write);//以写方式打开目的文件
int max = Convert.ToInt32(Math.Ceiling((Double)FormerOpenStream.Length / (Double)TranSize));//根据一次传输的大小,计算最大传输个数. Math.Ceiling 方法 (Double),返回大于或等于指定的双精度浮点数的最小整数值。
progressBar1.Maximum = max;//设置进度条的最大值
int FileSize; //每次要拷贝的文件的大小
if (TranSize < FormerOpenStream.Length) //如果分段拷贝,即每次拷贝内容小于文件总长度
{
byte[] buffer = new byte[TranSize]; //根据传输的大小,定义一个字节数组,用来存储传输的字节
int copied = 0;//记录传输的大小
int tem_n = 1;//设置进度栏中进度的增加个数
while (copied <= ((int)FormerOpenStream.Length - TranSize))
{
FileSize = FormerOpenStream.Read(buffer, 0, TranSize);//从0开始读到buffer字节数组中,每次最大读TranSize
FormerOpenStream.Flush(); //清空缓存
ToFileOpenStream.Write(buffer, 0, TranSize); //向目的文件写入字节
ToFileOpenStream.Flush();//清空缓存
ToFileOpenStream.Position = FormerOpenStream.Position; //是源文件的目的文件流的位置相同
copied += FileSize; //记录已经拷贝的大小
progressBar1.Value = progressBar1.Value + tem_n; //增加进度栏的进度块
}
int leftSize = (int)FormerOpenStream.Length - copied; //获取剩余文件的大小
FileSize = FormerOpenStream.Read(buffer, 0, leftSize); //读取剩余的字节
FormerOpenStream.Flush();
ToFileOpenStream.Write(buffer, 0, leftSize); //写入剩余的部分
ToFileOpenStream.Flush();
}
else //如果整体拷贝,即每次拷贝内容大于文件总长度
{
byte[] buffer = new byte[FormerOpenStream.Length];
FormerOpenStream.Read(buffer, 0, (int)FormerOpenStream.Length);
FormerOpenStream.Flush();
ToFileOpenStream.Write(buffer, 0, (int)FormerOpenStream.Length);
ToFileOpenStream.Flush();
}
FormerOpenStream.Close();
ToFileOpenStream.Close();
if (MessageBox.Show("copy finished") == DialogResult.OK)
{
progressBar1.Value = 0;
txtOriginalFile.Clear();
txtCopyFile.Clear();
str = "";
}
}
#endregion
public delegate void CopyFile_Delegate(); //定义委托/托管线程
/// <summary>
/// 在线程上执行委托(设置托管线程函数)
/// </summary>
public void SetCopyFile()
{
//this.Invoke(new CopyFile_Delegate(RunCopyFile)); //对指定的线程进行托管
//下面两行代码等同上面一行代码
CopyFile_Delegate copyfile_delegate = new CopyFile_Delegate(RunCopyFile); //创建delegate对象
this.Invoke(copyfile_delegate); //调用delegate
}
/// <summary>
/// 设置线程,运行copy文件,它与代理CopyFile_Delegate应具有相同的参数和返回类型
/// </summary>
public void RunCopyFile()
{
CopyFile(txtOriginalFile.Text, txtCopyFile.Text + "\\\\" + str, 1024, progressBar1); //复制文件
Thread.Sleep(0); //避免假死
thdCopyFile.Abort(); //关闭线程
}
private void btnOriginalFile_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK) //打开文件对话框
{
txtOriginalFile.Text = openFileDialog1.FileName; //获取源文件的路径
}
}
private void btnCopyFile_Click(object sender, EventArgs e)
{
if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
{
txtCopyFile.Text = folderBrowserDialog1.SelectedPath;//获取目的文件的路径
}
}
private void btnBeginToCopy_Click(object sender, EventArgs e)
{
if (txtOriginalFile.Text.Trim() == string.Empty)
{
MessageBox.Show("OriginalFile cannot be empty!");
return;
}
else
{
str = txtOriginalFile.Text;//记录源文件的路径
str = str.Substring(str.LastIndexOf('\\\\') + 1, str.Length - str.LastIndexOf('\\\\') - 1); //获取源文件的名称
}
if (txtCopyFile.Text.Trim() == string.Empty)
{
MessageBox.Show("The Copyfile path cannot be empty!");
return;
}
else
{
thdCopyFile = new Thread(new ThreadStart(SetCopyFile));
thdCopyFile.Start();
}
}
/// <summary>
/// 给textbox增加tooltip
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtOriginalFile_MouseHover(object sender, EventArgs e)
{
ToolTip tooltip = new ToolTip();
if (txtOriginalFile.Text.Trim() != string.Empty)
{
tooltip.Show(txtOriginalFile.Text, txtOriginalFile);
}
else
{
tooltip.Hide(txtOriginalFile);
}
}
/// <summary>
/// 给textbox增加tooltip
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txtCopyFile_MouseHover(object sender, EventArgs e)
{
ToolTip tooltip = new ToolTip();
if (txtCopyFile.Text.Trim() != string.Empty)
{
tooltip.Show(txtCopyFile.Text, txtCopyFile);
}
else
{
tooltip.Hide(txtCopyFile);
}
}
}
}
热门推荐
游览五岳的最佳顺序:从东至西,领略中华名山之美
古诗歌中的“鸟”与“猴”意象介绍
虞世南《蝉》:居高声自远,非是藉秋风
过年回家,带点“花生饼”,加到土里养花用,肥效十足!
反诈宣传 | 防范于心!请警惕“两卡”犯罪!
数字文旅:让旅游更加绿色、低碳、可持续
眼镜店服务员技能培训:提升服务质量与客户满意度的关键
应对宝宝不听话的有效策略与家长的心态调整技巧
教育小新看两会·爱问AI答 | 普及心理健康教育,该如何发力
男人抑郁了怎么办
3种表达情绪的方式,一种比一种戳男人心
口香糖是什么材料做的?口香糖的好处和坏处
金矿勘查,有新突破!
中签新股的策略情况如何?这种策略情况受哪些因素制约?
如何管理新股中签后的投资决策?这种决策对投资组合有何影响?
企业贷款的品种有哪些
血脂高者可以食用糙米吗?
蚂蚁药什么牌子效果最好,家里有蚂蚁怎么能彻底消灭?试过才知道
“简牍如山藏瑰宝,青史千秋照汗青”:论秦汉简牍所见吏治问题
怎么把文本文档换个excel
2025版美国成人血脂异常药物治疗指南颁布
制定薪酬管理制度的方法
猫和狗的这些行为是如何让人感迷惑的?
头疼恶心想吐冒虚汗是怎么回事
年假天数计算公式,年假通常怎么计算
动力电池快充技术专利的创新与市场应用前景如何?
除四害防治工作措施
张国荣抑郁症激发了怎样的关注?如何帮助朋友走出抑郁症困境?
网友600元出售金渐层,折射宠物行业寒冬
“晟”字读音与含义:chéng 还是 shèng?