Három megoldás: 
Az első File Stram-et használ:

Procedure FileCopy( Const sourcefilename, targetfilename: String );
Var
  S, T: TFileStream;
Begin
  S := TFileStream.Create( sourcefilename, fmOpenRead );
  try
   T := TFileStream.Create( targetfilename,fmOpenWrite or fmCreate );
   try
   T.CopyFrom(S, S.Size ) ;
   finally
   T.Free;
  end;
  finally
   S.Free;
  end;
End;


A második memóriablokkokat olvas és ír.
procedure FileCopy(const FromFile, ToFile: string);
var
  FromF, ToF: file;
  NumRead, NumWritten: Word;
  Buf: array[1..2048] of Char;
begin
  AssignFile(FromF, FromFile);
  Reset(FromF, 1); { Rekord nagysága = 1 }
  AssignFile(ToF, ToFile); { Megnyitja a kimeneti fájlt }
  Rewrite(ToF, 1); { Rekord nagysága = 1 }
  repeat
   BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
   BlockWrite(ToF, Buf, NumRead, NumWritten);
  until (NumRead = 0) or (NumWritten <> NumRead);
   CloseFile(FromF);
   CloseFile(ToF);
end;


A harmadik pedig az LZCopy-t használja
uses LZExpand;

...

procedure CopyFile(FromFileName, ToFileName: string);
var
  FromFile, ToFile: File;
begin
  AssignFile(FromFile, FromFileName); {Assign FromFile to FromFileName}
  AssignFile(ToFile, ToFileName); {Assign ToFile to ToFileName}
  Reset(FromFile); {Open file for input }
  try
   Rewrite(ToFile); { Create file for output }
   try
   { ha negatív érték érkezik vissza a fájl másolásakor }
   { elindítja a kivételkezelőt }
   if LZCopy(TFileRec(FromFile).Handle, TFileRec(ToFile).Handle) < 0 then
   raise EInOutError.Create('Error using LZCopy')
  finally
   CloseFile(ToFile); { Bezárja a ToFile-t }
  end;
  finally
   CloseFile(FromFile); { Bezárja a FromFile-t }
  end;
end;