复制文件时,如何显示进度条

简介: procedure mycopyfile(sourcef,targetf:string;i:integer);var       FromF,ToF:file;       NumRead,NumWritten:Integer;       Buf:array[1.

procedure mycopyfile(sourcef,targetf:string;i:integer);
var
       FromF,ToF:file;
       NumRead,NumWritten:Integer;
       Buf:array[1..2048] of Char;
       n:integer;
begin
         AssignFile(FromF,sourcef);
         Reset(FromF,    1); {    Record    size    =    1    }
         AssignFile(ToF,targetf); {    Open    output    file    }
         Rewrite(ToF,    1); {    Record    size    =    1    }
         n:=0;  
         repeat
                   BlockRead(FromF,    Buf,    SizeOf(Buf),    NumRead);
                   form1.ProgressBar1.Position:=sizeof(buf)*n*100    div    FileSize(FromF)*i div 4;
                   application.ProcessMessages;
                   //显示进度
                   BlockWrite(ToF,    Buf,    NumRead,    NumWritten);
                   inc(n);
           until    (NumRead    =    0)    or    (NumWritten    <>    NumRead);
           form1.ProgressBar1.Position:=100;
           CloseFile(FromF);
           CloseFile(ToF);
end;
====================================================================================

以下例子是关于delphi复制文件,加上进度条的方法的例子的关键代码:

procedure TForm1.Button1Click(Sender: TObject);
const
  getPath = 'c:/temp/get.rar';
  setPath = 'c:/temp/set.rar';
var
  getStream,setStream: TFileStream;
  num, n: Integer;
  buf: PByte;
  BufSize,block: Integer;
begin

  if not FileExists(getPath) then
  begin
    ShowMessage('源文件不存在');
    Exit;
  end;

  getStream := TFileStream.Create(getPath, fmOpenRead or fmShareExclusive);
  setStream := TFileStream.Create(setPath, fmCreate);

  num := getStream.Size;
  setStream.Size := num;
  getStream.Position := 0;
  setStream.Position := 0;

  BufSize := num;
  block := BufSize div 100;
  GetMem(buf, BufSize);

  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);
    setStream.WriteBuffer(buf^, n);
    ProgressBar1.Position := Trunc((1 - num / BufSize) * 100);
    Dec(num, n);
  end;

  FreeMem(buf, BufSize);
  getStream.Free;
  setStream.Free;

  ShowMessage('复制完毕');
  ProgressBar1.Position := 0;
end;

end.

 

相关文章
|
6月前
|
弹性计算 运维 Shell
显示进度条
【4月更文挑战第29天】
26 0
PyQt5 技术篇-调用文件对话框获取文件、文件夹路径。文件对话框返回选中的多个文件路径
PyQt5 技术篇-调用文件对话框获取文件、文件夹路径。文件对话框返回选中的多个文件路径
2470 0
PyQt5 技术篇-调用文件对话框获取文件、文件夹路径。文件对话框返回选中的多个文件路径
|
BI C++
C++文件(夹)选择对话框
由于各种应用,我们需要调用系统的打开文件对话框或者打开文件夹对话框,或两者兼有。今遇到这个情况已经解决,特写下这篇博文。 1.打开文件对话框常用的方法是使用系统的CFileDialog。这里介绍另外一种方法就是使用OPENFILENAME这个结构体和GetOpenFileName()这个函数,可以实现单选文件或者多选文件,代码如下: 需引入头文件#include "CommDlg.
2718 0
|
Shell Windows
如何在VBS脚本中显示“选择文件对话框”或“选择目录对话框”
、选择文件[XP操作系统,不能用于Win2000或98],使用“UserAccounts.CommonDialog”对象向用户显示一个标准的“文件打开”对话框Set objDialog = CreateObject("UserAccounts.
1749 0