45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:怎么样拷贝带进度条的文件?

怎么样拷贝带进度条的文件?

2016-08-25 10:45:06 来源:www.45fan.com 【

怎么样拷贝带进度条的文件?

带进度条的文件拷贝

可以拷贝任何文件,拷贝过程有进度条实时反映,并记录使用时间.

显示效果如图:

怎么样拷贝带进度条的文件?
private void btnCopyFile_Click(object sender, System.EventArgs e)
{
Nexsmart.MMS.FileManager.Class.CopyFileWorker cfw=new Nexsmart.MMS.FileManager.Class.CopyFileWorker();
string SourceFile=txtSourceFile.Text.Trim();
string AimFile=txtAimFile.Text.Trim();

if(!System.IO.File.Exists(SourceFile))
{
MessageBox.Show("源文件不存在","",MessageBoxButtons.OK,MessageBoxIcon.Warning);
if(txtSourceFile.CanFocus)
txtSourceFile.Focus();
return ;
}

if(false)//!CheckFilePath)
{
MessageBox.Show("目标文件路径不正确!","",MessageBoxButtons.OK,MessageBoxIcon.Warning);
if(txtAimFile.CanFocus)
txtAimFile.Focus();
return ;
}

cfw.SourceFile=txtSourceFile.Text;
cfw.AimFile=txtAimFile.Text;

cfw.OnCopyFile+=new Nexsmart.MMS.FileManager.Class.CopyFileWorker.CopyFileEventHandler(cfw_OnCopyFile);
cfw.WorkOvered+=new Nexsmart.MMS.FileManager.Class.CopyFileWorker.WorkOverEventHandler(cfw_WorkOvered);

System.Threading.Thread thread=new System.Threading.Thread(new System.Threading.ThreadStart(cfw.CopyFile));//后台线程
thread.Start();
timer1.Enabled=true;//启动计数器
timer1.Start();

}

private void cfw_OnCopyFile(long lngHad, long lngCount,string strShow)
{
this.pbarCopyFile.Maximum=(int)lngCount;
this.pbarCopyFile.Value=(int)lngHad;

this.lblHad.Text= Convert.ToString(lngHad/1024)+" KB";
this.lblCount.Text=Convert.ToString(lngCount/1024)+" KB";

lblShow.Text=strShow;
}

private void cfw_WorkOvered()
{
this.pbarCopyFile.Value=0;
this.pbarCopyFile.Visible=false;
SoureFile="";
timer1.Enabled=false;
timer1.Stop();//关闭计数器
elapse=0;//清零计数变量
lblShow.Text="";//清空显示
MessageBox.Show("文件复制完成","",MessageBoxButtons.OK,MessageBoxIcon.Information);

}
private void timer1_Tick(object sender, System.EventArgs e)
{
++elapse;
lblTime.Text=elapse.ToString()+" 秒";
}

//实现类

public class CopyFileWorker
{
public delegate void CopyFileEventHandler(long lngHad,long lngCount,string strShow);//定义一个委托
public event CopyFileEventHandler OnCopyFile;//定义一个事件,在Copy文件时触发

public delegate void WorkOverEventHandler();//定义一个委托
public event WorkOverEventHandler WorkOvered;//定义一个事件,在Copy文件完成时触发

public CopyFileWorker()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

public CopyFileWorker(string source,string aim)
{
_sourceFile=source;
_aimFile=aim;
}
private string _sourceFile;//源文件路径
public string SourceFile
{
get
{
return _sourceFile;
}
set
{
_sourceFile=value;
}
}
private string _aimFile;//目标文件路径
public string AimFile
{
get
{
return _aimFile;
}
set
{
_aimFile=value;
}
}
/// <summary>
/// 二进制读取文件,任何文件
/// </summary>
public void CopyFile()
{
byte[] bytTemp=new byte[4096];//字节数组

long lngHad=0;
long lngCount;
int z=5000;

//源文件流
System.IO.FileStream fsSource=new System.IO.FileStream(SourceFile,System.IO.FileMode.Open,System.IO.FileAccess.Read,System.IO.FileShare.Read,4);
//二进制读取器
System.IO.BinaryReader bRead=new System.IO.BinaryReader(fsSource);
//定位源文件流的头部
bRead.BaseStream.Seek(0,System.IO.SeekOrigin.Begin);
if(fsSource.Position>0)
fsSource.Position=0;

lngCount=fsSource.Length;

if(System.IO.File.Exists(AimFile))
System.IO.File.Delete(AimFile);

//目标文件流
System.IO.FileStream fsAim=new System.IO.FileStream(AimFile,System.IO.FileMode.CreateNew,System.IO.FileAccess.Write,System.IO.FileShare.Write,4);
//二进制写入器
System.IO.BinaryWriter bWrite=new System.IO.BinaryWriter(fsAim);

while(z>=4096)
{
z=(int)bRead.Read(bytTemp,0,bytTemp.Length);//读入字节数组,返回读取的字节数量,如果小于4096,则到了文件尾
bWrite.Write(bytTemp,0,bytTemp.Length);//从字节数组写入目标文件流

lngHad+=z;
string show="从"+SourceFile+"到"+AimFile;
OnCopyFile(lngHad,lngCount,show);//触发事件来控制主线程 这里是进度条和已完成复制文件字节显示
}

bWrite.Flush();//清理缓存区

bWrite.Close();
bRead.Close();

fsAim.Close();
fsSource.Close();

WorkOvered();//触发事件,调用完成复制后的处理程序

}
}


本文地址:http://www.45fan.com/dnjc/67344.html
Tags: 文件 进度 拷贝
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部