[Back to WIN-OS2 SWAG index]  [Back to Main SWAG index]  [Original]

Unit Fcopy;

Interface

{copy file: return TRUE is successful or FALSE if something
 went wrong}
 Function COPYFILE(Source, Target : String) : Boolean;


Implementation
uses
wintypes, winprocs, windos;


{--- buffer for file copy -------}
Type
CopyBuf = Array[1..32768] of Byte;  {32kb buffer!}

Var
Buffers : CopyBuf;                 {pointer for buffer}


{------------------ Print an Error Message -------------}
Procedure ErrorMessage(Title,Msg : PChar);
Begin
  MessageBox(GetFocus,Msg,Title,mb_IconExclamation+mb_OK);
End;


{--------- copy from Source to Target ---------}
Function COPYFILE(Source, Target : String) : Boolean;

Var
SourceFile,TargetFile   : File;
BytesRead,
BytesWritten  : Integer;

TotalRead,      {bytes from source file}
TotalWritten,   {bytes from target file}

OldTime       : LongInt;


Begin {CopyFile}

   CopyFile  := False;

   If Source = Target then
   begin
     ErrorMessage(' ERROR ',' Same Source and Target files! ');
     exit;
   end;


   Assign(SourceFile,Source);

   {$I-}
   Reset(SourceFile,1);
   {$I+}

   if IORESULT <> 0 then
   begin
     ErrorMessage(' ERROR ',' I am unable to open the source file');
     exit;
   end;


    Assign(TargetFile,Target);

    {$I-}
      Rewrite(TargetFile,1);
    {I+}

     if ioresult <> 0 then
      begin
        ErrorMessage(' ERROR ',' I am unable to create the target file ');
        Close(SourceFile);
        EXIT;
      end;


      GetFTime(SourceFile,OldTime);  {* get the old time & date stamp *}

      New(Buffers);
      TotalRead    := 0;
      TotalWritten := 0;


     {$I-}
      While not Eof(SourceFile) do
      begin
         BlockRead(SourceFile,  Buffers, Sizeof(Buffers), BytesRead);
         BlockWrite(TargetFile, Buffers, BytesRead, BytesWritten);

         Inc(TotalRead,    BytesRead);    {monitor the total size}
         Inc(TotalWritten, BytesWritten); {of bytes being copied}
      end;
     {$I+}

     if ioresult <> 0 then
      begin
        ErrorMessage(' ERROR ',' Error encountered during file copy ');
        Dispose(Buffers);

        {$I-}
        Close(SourceFile);
        Close(TargetFile);
        {$I+} If IoResult <> 0 Then {leave anyway};

        EXIT;
      end;


      {$I-}
        Close(SourceFile);
        SetFTime(TargetFile, OldTime);  {* reset the date and time *}
        Close(TargetFile);
      {$I+} If IoResult <> 0 Then {};


     Dispose(Buffers);

     If TotalRead <> TotalWritten
     Then {mismtach in bytes read and copied}
     begin
       ErrorMessage('ERROR',
       ' Discrepancies exist in the source and target file sizes!');

       Exit;
     end;


     {if we get here, all went well}

     CopyFile := True;

End; {copyfile}

End.


[Back to WIN-OS2 SWAG index]  [Back to Main SWAG index]  [Original]