Mirror

Demo of file copying (TFileStream) in a thread (TThread) (Views: 60)


Problem/Question/Abstract:

Demo of file coping (TFileStream) in a thread (TThread). It also resumes copying of files that have been partialy copied.

Answer:

unit copythread;

interface

uses
  Classes, SysUtils;

const
  KB1 = 1024;
  MB1 = 1024 * KB1;
  GB1 = 1024 * MB1;

type
  TCopyFile = class(TThread)
  public
    Percent: Integer;
    Done, ToDo: Integer;
    Start: TDateTime;
    constructor Create(Src, Dest: string);
  private
    { Private declarations }
    IName, OName: string;
  protected
    procedure Execute; override;
  end;

implementation

{ TCopyFile }

constructor TCopyFile.Create(Src, Dest: string);
begin
  IName := Src;
  OName := Dest;
  Percent := 0;
  Start := Now;
  FreeOnTerminate := True;
  inherited Create(True);
end;

procedure TCopyFile.Execute;
var
  fi, fo: TFileStream;
  dod, did: Integer;
  cnt, max: Integer;

begin

  Start := Now;
  try
    { Open existing destination }
    fo := TFileStream.Create(OName, fmOpenReadWrite);
    fo.Position := fo.size;
  except
    { otherwise Create destination }
    fo := TFileStream.Create(OName, fmCreate);
  end;
  try
    { open source }
    fi := TFileStream.Create(IName, fmOpenRead);
    try
      { synchronise dest en src }
      cnt := fo.Position;
      fi.Position := cnt;
      max := fi.Size;
      ToDo := Max - cnt;
      Done := 0;

      { start copying }
      repeat
        dod := MB1; // Block size
        if cnt + dod > max then
          dod := max - cnt;
        if dod > 0 then
          did := fo.CopyFrom(fi, dod);
        cnt := cnt + did;
        Percent := Round(Cnt / Max * 100);

        Done := Done + did;
        ToDo := Max;
      until (dod = 0) or (Terminated);

    finally
      fi.free;
    end;
  finally
    fo.free;
  end;
end;

end.

<< Back to main page