[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]