您的位置:首页 > 其它

带进度条的文件拷贝

2006-09-07 16:44 218 查看
带进度条的文件拷贝

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

显示效果如图:



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();//触发事件,调用完成复制后的处理程序

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: