进度复制文件

var getStream, setStream: TFileStream; num, n: Integer; buf: PByte; BufSize, block: Integer; begin if not FileExists(edit1.text) then begin ShowMessage('源文件不存在!'); Exit; end; getStream := TFileStream.Create(edit1.text, fmOpenRead or fmShareExclusive); //源文件 setStream := TFileStream.Create(edit2.text, fmCreate); //目标文件 num := getStream.Size; //源文件的大小 setStream.Size := num; //设置目标文件的大小跟源文件一样大 getStream.Position := 0; setStream.Position := 0; BufSize := num; //缓冲区内存的大小 block := BufSize div 100; //把源文件分割成100份,block是一份的大小 GetMem(buf, BufSize); //在堆栈中划出一个BSize大小的空白内存 ProgressBar1.Max := 100; ProgressBar1.min := 0; ProgressBar1.Position := 0; while num <> 0 do begin Application.ProcessMessages; //在复制的过程中,程序还能继续响应其他操作而不锁死 n := block; if n > num then n := num; getStream.ReadBuffer(buf^, n); //从源文件复制大小为n的数据到内存 setStream.WriteBuffer(buf^, n); //从内存中把大小为n的数据复制到目标文件 ProgressBar1.Position := Trunc((1 - num / BufSize) * 100); //进度条相应的增加到已经复制的文件数据量 Dec(num, n); end; FreeMem(buf, BufSize); getStream.Free; setStream.Free; showmessage('"' + edit1.text + '"Copy完毕!'); ProgressBar1.Position := 0; end;

你可能感兴趣的:(进度复制文件)