[Back to FILES SWAG index]  [Back to Main SWAG index]  [Original]


{This way uses a File stream.}
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;


{Here is one that uses a TMemoryStream:}
procedure FileCopy(const FromFile, ToFile: string);
begin
  with TMemoryStream.Create do
  try
    LoadFromFile(FromFile);

    SaveToFile(ToFile);
  finally
    Free;
  end;
end;


{This way uses memory blocks for read/write.}
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);		{ Record size = 1 }
  AssignFile(ToF, ToFile);	{ Open output file }
  Rewrite(ToF, 1);		{ Record size = 1 }
  repeat
    BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
    BlockWrite(ToF, Buf, NumRead, NumWritten);
  until (NumRead = 0) or (NumWritten <> NumRead);

  System.CloseFile(FromF);
  System.CloseFile(ToF);
end;

{This one uses LZCopy, which 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
      { copy the file an if a negative value is returned raise an exception }

      if LZCopy(TFileRec(FromFile).Handle, TFileRec(ToFile).Handle) < 0 then
        raise Exception.Create('Error using LZCopy')
    finally
      CloseFile(ToFile);  { Close ToFile }
    end;
  finally
    CloseFile(FromFile);  { Close FromFile }
  end;
end;


This one is from Dr. Bob (Swart).  The point of this one is that it contains a callback function that gives you the ability to callback.  This can be used for progress bars and the like.  Groetjes, Dr. Bob!


 {$A+,B-,D-,F-,G+,I+,K+,L-,N+,P+,Q-,R-,S+,T+,V-,W-,X+,Y-}
 unit FileCopy;

 (*
   FILECOPY 1.5 (Public Domain)
   Borland Delphi 1.0
   Copr. (c) 1995-08-27 Robert E. Swart (100434.2072@compuserve.com)
                        P.O. box 799
                        5702 NP  Helmond
                        The Netherlands
   -----------------------------------------------------------------
   This unit implements a FastFileCopy procedure that is usable from
   Borland Pascal (real mode, DPMI or Windows) and Borland Delphi. A
   callback routine (or nil) can be given as extra argument.

   Example of usage:

   {$IFDEF WINDOWS}
    uses FileCopy, WinCrt;
   {$ELSE}
    uses FileCopy, Crt;

   {$ENDIF}

      procedure CallBack(Position, Size: LongInt); far;
      var i: Integer;
      begin
        { do you stuff here... }
        GotoXY(1,1);
        for i:=1 to (80 * Position) div Size do write('X')
      end {CallBack};

    begin
      FastFileCopy('C:\AUTOEXEC.BAT', 'C:\AUTOEXEC.BAK', nil);
      FastFileCopy('C:\CONFIG.SYS', 'C:\CONFIG.BAK', CallBack)
    end.
 *)
 interface

 Type
   TCallBack = procedure (Position, Size: LongInt); { export; }

   procedure FastFileCopy(Const InFileName, OutFileName: String;
                          CallBack: TCallBack);


 implementation
 {$IFDEF VER80}
 uses SysUtils;
 {$ELSE}
   {$IFDEF WINDOWS}
   uses WinDos;
   {$ELSE}
   uses Dos;
   {$ENDIF}
 {$ENDIF}

   procedure FastFileCopy(Const InFileName, OutFileName: String;
                          CallBack: TCallBack);
   Const BufSize = 8*4096; { 32Kbytes gives me the best results }
   Type
     PBuffer = ^TBuffer;
     TBuffer = Array[1..BufSize] of Byte;
   var Size: Word;
       Buffer: PBuffer;
       infile,outfile: File;
       SizeDone,SizeFile,TimeDateFile: LongInt;
   begin
     if (InFileName <> OutFileName) then
     begin
       Buffer := nil;
       Assign(infile,InFileName);

       System.Reset(infile,1);
       {$IFDEF VER80}
       try
       {$ELSE}
       begin
       {$ENDIF}
         SizeFile := FileSize(infile);
         Assign(outfile,OutFileName);
         System.Rewrite(outfile,1);
         {$IFDEF VER80}
         try
         {$ELSE}
         begin
         {$ENDIF}
           SizeDone := 0;
           New(Buffer);
           repeat
             BlockRead(infile,Buffer^,BufSize,Size);
             Inc(SizeDone,Size);
             if (@CallBack <> nil) then
               CallBack(SizeDone,SizeFile);

             BlockWrite(outfile,Buffer^,Size)
           until Size < BufSize;
           {$IFDEF VER80}
           FileSetDate(TFileRec(outfile).Handle,
             FileGetDate(TFileRec(infile).Handle));
           {$ELSE}
           GetFTime(infile, TimeDateFile);
           SetFTime(outfile, TimeDateFile);
           {$ENDIF}
         {$IFDEF VER80}
         finally
         {$ENDIF}
           if Buffer <> nil then Dispose(Buffer);
           System.close(outfile)
         end;
       {$IFDEF VER80}
       finally
       {$ENDIF}

         System.close(infile)
       end
     end
     {$IFDEF VER80}
     else
       Raise EInOutError.Create('File cannot be copied onto itself')
     {$ENDIF}
   end {FastFileCopy};
 end.



[Back to FILES SWAG index]  [Back to Main SWAG index]  [Original]