home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 15 / CD_ASCQ_15_070894.iso / maj / swag / copymove.swg < prev    next >
Text File  |  1994-05-27  |  58KB  |  2 lines

  1. SWAGOLX.EXE (c) 1993 GDSOFT  ALL RIGHTS RESERVED 00020         FILE COPY/MOVE ROUTINES                                           1      05-28-9313:35ALL                      SWAG SUPPORT TEAM        Copy File #1             IMPORT              6      ▐S¿¥ Program Copy;ππVar InFile, OutFile : File;π    Buffer          : Array[ 1..512 ] Of Char;π    NumberRead,π    NumberWritten   : Word;ππbeginπ   If ParamCount <> 2 Then Halt( 1 );π   Assign( InFile, ParamStr( 1 ) );π   Reset ( InFile, 1 );     {This is Reset For unTyped Files}π   Assign  ( OutFile, ParamStr( 2 ) );π   ReWrite ( OutFile, 1 );  {This is ReWrite For unTyped Files}π   Repeatπ      BlockRead ( InFile, Buffer, Sizeof( Buffer ), NumberRead );π      BlockWrite( OutFile, Buffer, NumberRead, NumberWritten );π   Until (NumberRead = 0) or (NumberRead <> NumberWritten);π   Close( InFile );π   Close( OutFile );πend.π              2      05-28-9313:35ALL                      SWAG SUPPORT TEAM        Copy File #2             IMPORT              30     ▐S╘ä {I've been trying to figure out how to do a fairly fast copyπ in pascal.  It doesn't have to be faster then Dos copy, butπ I definatly DON'T want to shell out to Dos to do it!π I've got the following working... in the IDE of Turbo 6.0!π If I compile it, it wont work at all.  ALSO... If you COMPπ the Files to check For errors, They are there.  (UGH!)π (ie, it isn't a perfect copy!)π The thing is I want to get as much as I can in each pass!π (But turbo has limits!)π Heres my code... Just rough, so no Real comments.π}ππProgram Copy (InFile, OutFile);ππUses Dos;ππVarπ   I, Count, BytesGot : Integer;π   BP : Pointer;π   InFile,OutFile:File;ππ   FI,FO : Word;ππ   Path,π   FileName : String[80];ππ   DirInfo : SearchRec;π   BaseRec, RecSize : longInt;ππbeginπ   FileName := ParamStr(1);             {Set the SOURCE as the first ParamSTR}π   Path := ParamStr(2);                 {Set the Dest.  as the 2nd paramSTR}ππ   If paramCount = 0 Thenπ      beginπ           Writeln('FastCopy (C) 1993 - Steven Shimatzki');π           Writeln('Version : 3.0   Usage: FastCopy <Source> <Destination>');π           Halt(1);π      end;ππ   FindFirst(FileName,Archive,DirInfo);ππ   If DirInfo.Name <> '' Thenπ   beginππ       RecSize := MaxAvail - 1024;  {Get the most memory but leave some}π       BaseRec := RecSize;ππ       If RecSize > DirInfo.Size Then      {If a "SMALL" File, gobble it up}π           RecSize := DirInfo.Size;        {In one pass!  Size = Recordsize}ππ       Count := DirInfo.Size Div RecSize;  {Find out how many Passes!}ππ       GetMem (Bp, RecSize);   {Allocate memory to the dynamic Variable}ππ       Assign (InFile,FileName);       {Assign the File}π       Assign (OutFile,Path);          {Assign the File}ππ       Filemode := 0;     {Open the INFile as READONLY}ππ       Reset(InFile,RecSize);      {open the input}π       ReWrite(OutFile,RecSize);   {make the output}πππ       For I := 1 to Count do    {Do it For COUNT passes!}π       beginππ            {$I-}π            Blockread(InFile,BP^,1,BytesGot);   {Read 1 BLOCK}π            {$I+}ππ            BlockWrite(outFile,BP^,1,BytesGot);   {Write 1 BLOCK}ππ            If BytesGot <> 1 Thenπ               Writeln('Error!  Disk Full!');ππ       end;ππ{If not all read in, then I have to get the rest seperatly!  partial Record!}ππ       If Not ((Count * RecSize) = DirInfo.Size) Thenπ       beginπ            RecSize := (DirInfo.Size - (Count * RecSize)) ;π                       {^^^ How much is left to read? get it in one pass!}πππ            FreeMem(Bp, BaseRec);      {Dump the mem back}π            GetMem(Bp, RecSize);       {Get the new memory}ππ            FileMode := 0;         {Set input For readonly}ππ            Reset (InFile,1);ππ            Filemode := 2;         {Set output For Read/Write}ππ            Reset (OutFile,1);ππ            Seek(InFile, (Count * BaseRec));   {Move to old location}π            Seek(OutFile, (Count * BaseRec));{ same }ππ            FI := FilePos(InFile);    {Just used to see where I am in the File}π            FO := FilePos(OutFile);   {Under the Watch Window... Remove later}ππ            {$I-}π            BlockRead(InFile,Bp^,RecSize,BytesGot);    {REad the File}π            {$I+}ππ            BlockWrite(OutFile,Bp^,RecSize,BytesGot);  {Write the File}ππ       end;ππ       Close(OutFile);π       Close(InFile);ππ       FreeMem (Bp,RecSize);ππ   end;ππend.ππ{πYou don't close the input- and output File when your finished With theπfirst count passes. Maybe your last block will not be written to disk,πwhen you reopen the outputFile For writing. I can't see another problemπright now.                                                                                                       3      05-28-9313:35ALL                      SWAG SUPPORT TEAM        Copy File #3             IMPORT              10     ▐S²┤ {π> Or can someone put up some Procedure that will copy Files.π}ππ{$O+}ππUsesπ  Dos;ππFunction CopyFile(SourceFile, TargetFile : String): Byte;π{ Return codes:  0 successfulπ                 1 source and target the sameπ                 2 cannot open sourceπ                 3 unable to create targetπ                 4 error during copyπ}πVarπ  Source,π  Target  : File;π  BRead,π  BWrite  : Word;π  FileBuf : Array[1..2048] of Char;πbeginπ  If SourceFile = TargetFile thenπ  beginπ    CopyFile := 1;π    Exit;π  end;π  Assign(Source,SourceFile);π  {$I-}π  Reset(Source,1);π  {$I+}π  If IOResult <> 0 thenπ  beginπ    CopyFile := 2;π    Exit;π  end;π  Assign(Target,TargetFile);π  {$I-}π  ReWrite(Target,1);π  {$I+}π  If IOResult <> 0 thenπ  beginπ    CopyFile := 3;π    Exit;π  end;π  Repeatπ    BlockRead(Source,FileBuf,SizeOf(FileBuf),BRead);π    BlockWrite(Target,FileBuf,Bread,BWrite);π  Until (Bread = 0) or (Bread <> BWrite);π  Close(Source);π  Close(Target);π  If Bread <> BWrite thenπ    CopyFile := 4π  elseπ    CopyFile := 0;πend; {of func CopyFile}ππ                                                                                         4      05-28-9313:35ALL                      SWAG SUPPORT TEAM        Copy File #4             IMPORT              20     ▐SEo {I am having a bit of a problem in Pascal.  I am writing a routine toπcopy Files.  The Program is to be used in an area where anything atπall can happen, so it has to be totally bullet-proof.  All is well,πexcept one little thing.  Should the Program encounter a major diskπerror (for example, the user removes the disk While the copy is takingπplace), the Program breaks into Dos after an 'Abort, Retry, Fail'πprompt.  Now comes the weird part.  This crash to Dos only occurs onlyπonce the Program terminates.  It processes the error perfectly, and onlyπgives the error once my entire Program is at an end!  Following is theπsource code in question:π}πProgram FileTest;ππUsesπ  Dos;ππProcedure FileCopy(SrcPath, DstPath, FSpec : String; Var ExStat : Integer);πVarπ  DirInfo : SearchRec;π  Done    : Boolean;ππProcedure Process(X : String);πVarπ  Source,π  Dest     : File;π  Buffer   : Array[1..4096] of Byte;π  ReadCnt,π  WriteCnt : Word;ππbeginπ  {$I-}π  ExStat:=0;π  Assign(Source,SrcPath+X);π  Reset(Source,1);π  If IOResult <> 0 thenπ    ExStat := 1;π  If ExStat = 0 thenπ  beginπ    Assign(Dest,DstPath+X);π    ReWrite(Dest,1);π    If IOResult <> 0 thenπ      ExStat := 2;π    If ExStat = 0 thenπ    beginπ      Repeatπ        BlockRead(Source,Buffer,Sizeof(Buffer),ReadCnt);π        BlockWrite(Dest,Buffer,ReadCnt,WriteCnt);π        If IOResult <> 0 thenπ          ExStat := 3;π      Until (ReadCnt = 0) or (WriteCnt <> ReadCnt) or (ExStat <> 0);π      Close(Dest);π    end;π    Close(Source);π  end;π  {$I+}πend;ππbeginπ  {$I-}π    ExStat := 0;π    FindFirst(SrcPath + FSpec, Archive, DirInfo);π    Done := False;π    While Not Done doπ    beginπ      Write('Copying ',DirInfo.Name,' ');π      Process(DirInfo.Name);π      If (ExStat = 0) thenπ      beginπ        FindNext(DirInfo);π        If (DosError<>0) thenπ          Done := True;π      endπ      elseπ        Done := True;π    end;π  {$I+}πend;ππProcedure Main;πVarπ  ExC : Integer;πbeginπ  FileCopy('C:\Dos\','A:\','*.BAS',ExC);π  Writeln('Exit Code:',ExC);πend;ππbeginπ  Main;π  Writeln('Program is Complete');πend.π{πThat's it.  All errors get logged normally, and right after 'Program isπComplete', I get an 'Abort, Retry, Fail'.  It must be a File left open,πand TP tries to close it once the Program terminates, but I can'tπimagine which File it might be!π}                                                                                                       5      05-28-9313:35ALL                      SWAG SUPPORT TEAM        Copy File #5             IMPORT              16     ▐SPQ { copy Files With certain extentions to a specific directory (Bothπ parameters specified at the command line or in a Text File).. I cannotπ seem to find a command withing TP 6.0 to copy Files.. I have lookedπ several times through the manuals but still no luck.. I even asked theπ teacher in Charge and he did not even know! Ok all you Programmers outπ there.. Show your stuff.. If you Really want to be kind, help me outπ on this..I am just starting in TP and this is all new to me!π}ππ{$R-,I+} {Set range checking off, IOChecking on}π{$M $400, $2000, $10000} {Make sure enough heap space}π{    1k Stack, 8k MinHeap, 64k MaxHeap }πTypeπ        Buf = Array[0..65527] of Byte;πVarπ        FileFrom, FileTo : File;π        Buffer : ^Buf;π        BytesToRead, BytesRead : Word;π        MoreToCopy, IoStatus : Boolean;ππbeginπ        {Determine largest possible buffer useable}π        If MaxAvail < 65528 thenπ                BytesToRead := MaxAvailπ        elseπ                BytesToRead := 65528;π        Writeln('Program is using ', BytesToRead , ' Bytes of buffer');π        GetMem(Buffer, BytesToRead);    {Grab heap memory For buffer}π        Assign(FileFrom, 'File_1');π        Assign(FileTo, 'File_2');π        Reset(FileFrom, 1);     {Open File With 1Byte Record size}π        ReWrite(FileTo, 1);π        IoStatus := (IoResult = 0);π        MoreToCopy := True;π        While IoStatus and MoreToCopy do beginπ        {$I-}π                blockread(FileFrom, Buffer^, BytesToRead, BytesRead);π                blockWrite(FileTo, Buffer^, BytesRead);π        {$I+}π                MoreToCopy := (BytesRead = BytesToRead);π                IoStatus := (IoResult=0);π        end;π        Close(FileTO);π        Close(FileFrom);π        FreeMem(Buffer, BytesToRead); {Release Heap memory}π        If (not IoStatus) thenπ            Writeln('Error copying File!!!');πend.π                                                6      05-28-9313:35ALL                      SWAG SUPPORT TEAM        Copy File #6             IMPORT              33     ▐S»
  2.  {$A+,B-,D-,E+,F-,I+,L-,N-,O-,R+,S+,V-}π{$M 16384,65536,655360}ππProgram scopy;ππUsesπ  Dos,π  tpDos,π  sundry,π  Strings;ππTypeπ  buffer_Type = Array[0..65519] of Byte;π  buffptr     = ^buffer_Type;ππVarπ  f1,f2       : File;π  fname1,π  fname2,π  NewFName,π  OldDir      : PathStr;π  SRec        : SearchRec;π  errorcode   : Integer;π  buffer      : buffptr;πConstπ  MakeNewName : Boolean = False;π  FilesCopied : Word = 0;π  MaxHeapSize = 65520;ππFunction IOCheck(stop : Boolean; msg : String): Boolean;π  Varπ    error : Integer;π  beginπ    error := Ioresult;π    IOCheck := (error = 0);π    if error <> 0 then beginπ      Writeln(msg);π      if stop then beginπ        ChDir(OldDir);π        halt(error);π      end;π    end;π  end;ππProcedure Initialise;π  Varπ    temp  : String;π    dir   : DirStr;π    name  : NameStr;π    ext   : ExtStr;π  beginπ    if MaxAvail < MaxHeapSize then beginπ      Writeln('Insufficient memory');π      halt;π    endπ    elseπ      new(buffer);π    {I-} GetDir(0,OldDir); {$I+} if IOCheck(True,'') then;π    Case ParamCount ofπ      0: beginπ           Writeln('No parameters provided');π           halt;π         end;π      1: beginπ           TempStr := ParamStr(1);π           if not ParsePath(TempStr,fname1,fname2) then beginπ             Writeln('Invalid parameter');π             halt;π           end;π           {$I-} ChDir(fname2); {$I+} if IOCheck(True,'') then;π         end;π      2: beginπ           TempStr := ParamStr(1);π           if not ParsePath(TempStr,fname1,fname2) then beginπ             Writeln('Invalid parameter');π             halt;π           endπ           elseπ             {$I-} ChDir(fname2); {$I+} if IOCheck(True,'') then;ππ           TempStr := ParamStr(2);π           if not ParsePath(TempStr,fname2,temp) then beginπ             Writeln('Invalid parameter');π             halt;π           end;π           FSplit(fname2,dir,name,ext);π           if length(name) <> 0 thenπ             MakeNewName := True;π         end;π    else beginπ           Writeln('too many parameters');π           halt;π         end;π    end; { Case }π  end; { Initialise }ππProcedure CopyFiles;π  Varπ    result : Word;ππ  Function MakeNewFileName(fn : String): String;π    Varπ      temp  : String;π      dir   : DirStr;π      name  : NameStr;π      ext   : ExtStr;π      numb  : Word;π    beginπ      numb := 0;π      FSplit(fn,dir,name,ext);π      Repeatπ        inc(numb);π        if numb > 255 then beginπ          Writeln('Invalid File name');π          halt(255);π        end;π        ext := copy(Numb2Hex(numb),2,3);π        temp := dir + name + ext;π        Writeln(temp);π      Until not ExistFile(temp);π      MakeNewFileName := temp;π    end; { MakeNewFileName }πππ  beginπ    FindFirst(fname1,AnyFile,Srec);π    While Doserror = 0 do beginπ      if (SRec.attr and $19) = 0 then beginπ        if MakeNewName thenπ          NewFName := fname2π        elseπ          NewFName := SRec.name;π        if ExistFile(NewFName) thenπ          NewFName := MakeNewFileName(NewFName);π        {$I-}π        Writeln('Copying ',SRec.name,' > ',NewFName);π        assign(f1,SRec.name);π        reset(f1,1);π        if { =1= } IOCheck(False,'1. Cannot copy '+fname1) then beginπ          assign(f2,fname2);π          reWrite(f2,1);π          if IOCheck(False,'2. Cannot copy '+SRec.name) thenπ            Repeatπ              BlockRead(f1,buffer^,MaxHeapSize);π              if IOCheck(False,'3. Cannot copy '+SRec.name) thenπ                result := 0π              else beginπ                BlockWrite(f2,buffer^,result);π                if IOCheck(False,'4. Cannot copy '+NewFName) thenπ                  result := 0;π              end;π            Until result < MaxHeapSize;π          close(f1); close(f2);π          if IOCheck(False,'Error While copying '+SRec.name) then;π        end; { =1= }π      end;  { if SRec.attr }π      FindNext(Srec);π    end; { While Doserror = 0 }π  end; { CopyFiles }ππbeginπ  Initialise;π  CopyFiles;π  ChDir(OldDir);πend.ππ                                                                                       7      05-28-9313:35ALL                      FLOOR A.C. NAAIJKENS     Copy File with Display   IMPORT              15     ▐S!┴ Hello Matthew!ππAnswering a msg of <Monday April 12 1993>, from Matthew Staikos to All:ππThe Norton-like bar along with the copying won't compile,πbut you get the idea, no?ππ  {$I-}π  function __copyfil(π    show: boolean; x1,x2,y,f,b: byte; fs: longint; src, targ: stringπ  ): byte;π  {π   return codes:π     0 successfulπ     1 source and target the sameπ     2 cannot open sourceπ     3 unable to create targetπ     4 error during copyπ     5 cannot allocate bufferπ  }π  constπ    bufsize = 16384;ππ  typeπ    fbuf = array[1..bufsize] of char;π    fbf  = ^fbuf;ππ  varπ    source,π    target   :    file;π    bread,π    bwrite   :    word;π    filebuf  :    ^fbf;π    tr       : longint;π    nr       :    real;ππ  beginπ    if memavail > bufsize then new(filebuf) else beginπ      __copyfil := 5; exitπ    end;π    if src = targ then begin __copyfil := 1; exit end;π    assign(source, src); reset(source,1);π    if ioresult <> 0 then begin __copyfil := 2; exit end;π    assign(target, targ); rewrite(target,1);π    if ioresult <> 0 then begin __copyfil := 3; exit end;π    if show then __write(x1+2,y,f,b,__rep(x2-x1-3,'░')); tr := 0;π    repeatπ      blockread(source,filebuf^,bufsize,bread);π      tr := tr + bread; nr := tr/fs;π      nr := nr * (x2-x1-3);π      if show then __write(x1+2,y,f,b,__rep(trunc(nr), '█'));π      blockwrite(target,filebuf^,bread,bwrite);π    until (bread = 0) or (bread <> bwrite);π    if show then __write(x1+2,y,f,b,__rep((x2-x1-3),'█'));π    close(source); close(target);π    if bread <> bwrite then __copyfil := 4 else __copyfil := 0;π  end;π  {$I-}πππππFloorππ--- GoldED 2.40π * Origin: UltiHouse/2 5 Years! V32b/HST/16k8: x31,13,638709 (2:512/195)π                                                                                                      8      05-28-9313:35ALL                      FLOOR A.C. NAAIJKENS     Copy File from ECO-LIB   IMPORT              14     ▐S.u {πNote : Functions beginning with "__" come from the ECO Library - Kerry.ππFLOOR A.C. NAAIJKENSππThe Norton-like bar along with the copying won't compileππ{$I-}πfunction __copyfil(show : boolean; x1, x2, y, f, b : byte;π                   fs : longint; src, targ : string) : byte;π{π return codes:π  0 successfulπ  1 source and target the sameπ  2 cannot open sourceπ  3 unable to create targetπ  4 error during copyπ  5 cannot allocate bufferπ}πconstπ  bufsize = 16384;ππtypeπ  fbuf = array[1..bufsize] of char;π  fbf  = ^fbuf;ππvarπ  source,π  target   :    file;π  bread,π  bwrite   :    word;π  filebuf  :    ^fbf;π  tr       : longint;π  nr       :    real;ππbeginπ  if memavail > bufsize thenπ    new(filebuf)π  elseπ  beginπ    __copyfil := 5;π    exitπ  end;π  if src = targ thenπ  beginπ    __copyfil := 1;π    exitπ  end;π  assign(source, src);π  reset(source,1);π  if ioresult <> 0 thenπ  beginπ    __copyfil := 2;π    exitπ  end;π  assign(target, targ);π  rewrite(target,1);π  if ioresult <> 0 thenπ  beginπ    __copyfil := 3;π    exitπ  end;π  if show thenπ    __write(x1 + 2 , y, f, b, __rep(x2 - x1 - 3, '░'));π  tr := 0;π  repeatπ    blockread(source, filebuf^, bufsize, bread);π    tr := tr + bread;π    nr := tr / fs;π    nr := nr * (x2 - x1 - 3);π    if show thenπ      __write(x1 + 2, y, f, b, __rep(trunc(nr), '█'));π    blockwrite(target, filebuf^, bread, bwrite);π  until (bread = 0) or (bread <> bwrite);π  if show thenπ    __write(x1 + 2, y, f, b, __rep((x2 - x1 - 3), '█'));π  close(source);π  close(target);π  if bread <> bwrite thenπ    __copyfil := 4π  elseπ    __copyfil := 0;πend;π{$I-}ππ                                             9      05-28-9313:35ALL                      SWAG SUPPORT TEAM        FAST Copy File           IMPORT              5      ▐Sç≡ {│o│ I want to make my buffer For the BlockRead command as       │o║π│o│ large as possible. When I make it above 11k, I get an       │o║π│o│ error telling me "too many Variables."                      │o║πUse dynamic memory, as in thanks a heap.π}πππif memavail > maxint  { up to 65520 }πthen bufsize := maxintπelse bufsize := memavail;πif i<128πthen Exitmsg('No memory')πelse getmem(buf,bufsize);πππ                                                                                                                10     05-28-9313:35ALL                      SWAG SUPPORT TEAM        Move File #1             IMPORT              49     ▐S─∞ {πI found a source * COPY.PAS * (don't know where anymore or who posted it) andπtried to Write my own move_Files Program based on it.ππThe simple idea is to move the Files specified in paramstr(1) to a destinationπdirectory specified in paramstr(2) and create the directories that do not yetπexist.ππOn a first look it seems just to work out ok. But yet it does not.ππto help me find the failure set paramstr(1) to any path you want (For exampleπD:\test\*.txt or whatever) and set paramstr(2) to a non existing path which isπC:\A\B\C\D\E\F\G\H\..\Z\A\B\C\D\E\F\ππThe directories C:\A through C:\A\B\C\D\F\..\Q\R\S will be created and than theπProgram hangs.ππWho can help me find what the mistake is?ππI Really will be grateful For any kind of help.ππThe code is:π}ππ{$A+,B-,D+,E+,F-,G-,I-,L+,N-,O-,R+,S-,V+,X-}πProgram aMOVE;ππUsesπ  Crt, Dos;πConstπ  BufSize = 32768;πVarπ  ioCode               : Byte;π  SrcFile, DstFile     : File;π  FileNameA,π  FileNameB            : String;π  Buffer               : Array[1..BufSize] of Byte;π  RecsRead             : Integer;π  DiskFull             : Boolean;π  CurrDir              : DirStr;        {Aktuelles Verzeichnis speichern}π  HelpList             : Boolean;       {Hilfe uber mogliche Parameter?}π  i,π  n                    : Integer;π  str                  : String[1];ππ  SDStr                : DirStr;        {Quellverzeichnis}π  SNStr                : NameStr;       {Quelldateiname}π  SEStr                : ExtStr;        {Quelldateierweiterung}ππ  DDStr                : DirStr;        {Zielverzeichnis}π  DNStr                : NameStr;       {Zieldateiname}π  DEStr                : ExtStr;        {Zieldateierweiterung}ππ  SrcInfo              : SearchRec;     {Liste der Quelldateien}π  SubDirStr            : Array [0..32] of DirStr;π  key                  : Char;πππ  Procedure SrcFileError(ioCode : Byte);π  beginπ    Write(#7, 'I/O result of ', ioCode, ' (decimal) ', #26);π    Case ioCode ofπ      $01 : WriteLn(' Source File not found.');π      $F3 : WriteLn(' too many Files open.');π    else WriteLn(' "Reset" unknown I/O error.');π    end;π  end;ππ  Procedure DstFileError(ioCode : Byte);π  beginπ    Write(#7, 'I/O result of ', ioCode, ' (decimal) ', #26);π    Case ioCode ofπ      $F0 : WriteLn(' Disk data area full.');π      $F1 : WriteLn(' Disk directory full.');π      $F3 : WriteLn(' too many Files open.');π    else WriteLn(' "ReWrite" unknown I/O error.');π    end;π  end;ππππProcedure EXPAR;                      {externe Parameter abfragen} beginπ  GetDir(0,CurrDir);                  {Aktuelles Verzeichnis speichern}π  if DDStr='' then DDStr:= CurrDir;   {Wenn keine Zialangabe, dann insπ                                       aktuelle Verzeichnis verschieben}π  FSplit(paramstr(1), SDStr, SNStr, SEStr);πend;ππProcedure Copy2Dest;πbeginπ  if FileNameB <> FileNameA thenπ    beginπ      Assign(SrcFile, FileNameA);π      Assign(DstFile, FileNameB);π      {* note second parameter in "reset" and "reWrite" of UNTyped Files. *}π      {$I-} Reset(SrcFile, 1); {$I+}π      ioCode := Ioresult;π      if (ioCode <> 0) then SrcFileError(ioCode)π      elseπ        beginπ          {$I-} ReWrite(DstFile, 1); {$I+}π          ioCode := Ioresult;π          if (ioCode <> 0) then DstFileError(ioCode)π          elseπ            beginπ              DiskFull := False;π              While (not EoF(SrcFile)) and (not DiskFull) doπ                beginπ                  {* note fourth parameter in "blockread". *}π                  {$I-}π                  BlockRead(SrcFile, Buffer, BufSize, RecsRead);π                  {$I+}π                  ioCode := Ioresult;π                  if ioCode <> 0 thenπ                    beginπ                      SrcFileError(ioCode);π                      DiskFull := Trueπ                    endπ                  elseπ                    beginπ                      {$I-}π                      BlockWrite(DstFile, Buffer, RecsRead);π                      {$I+}π                      ioCode := Ioresult;π                      if ioCode <> 0 thenπ                        beginπ                          DstFileError(ioCode);π                          DiskFull := Trueπ                        endπ                    endπ                end;π              if not DiskFull then WriteLn(FileNameB)π            end;π          Close(DstFile)π        end;π      Close(SrcFile)π    endπ  else WriteLn(#7, 'File can not be copied onto itself.')πend;ππProcedure ProofDest;πbeginπ  if length(paramstr(2)) > 67 then beginπ    Writeln;π    Writeln(#7,'Invalid destination directory specified.');π    Writeln('Program aborted.');π    Halt(1);π  end;π  FSplit(paramstr(2), DDStr, DNStr, DEStr);π  if copy(DNStr,length(DNStr),1)<>'.' then beginπ    insert(DNStr,DDStr,length(DDStr)+1);π    DNStr:='';π  end;π  if copy(DDStr,length(DDStr),1)<>'\' thenπ    insert('\',DDSTR,length(DDStr)+1);π  SubDirStr[0]:= DDStr;π  For i:= 1 to 20 do beginπ    SubDirStr[i]:=copy(DDStr,1,pos('\',DDStr));π    Delete(DDStr,1,pos('\',DDStr));π  end;π  For i:= 32 doWNto 1 do beginπ    if SubDirStr[i]= '' then n:= i-1;π  end;ππ  DDStr:= SubDirStr[0];π  SubDirStr[0]:='';ππ  For i:= 1 to n do beginπ    SubDirStr[0]:= SubDirStr[0]+SubDirStr[i];ππ    if copy(SubDirStr[0],length(SubDirStr[0]),1)='\' thenπ      delete(SubDirStr[0],length(SubDirStr[0]),1);ππ beginπ      {$I-}π      MkDir(SubDirStr[0]);π      {$I+}π      if Ioresult = 0 thenπ      WriteLn('New directory created: ', SubDirStr[0]);π    end;ππ    if copy(SubDirStr[0],length(SubDirStr[0]),1)<>'\' thenπ      insert('\',SubDirStr[0],length(SubDirStr[0])+1);π  end;πend;ππProcedure HandleMove;πbeginπ  FileNameA:= SDStr+SrcInfo.Name;π  FileNameB:= DDStr+SrcInfo.Name;π  Copy2Dest;π  Erase(SrcFile);πend;ππProcedure ExeMove;πbeginπ  ProofDest;π  FindFirst(paramstr(1), AnyFile, SrcInfo);π  While DosError = 0 do beginπ    HandleMove;π    FindNext(SrcInfo);π  end;πend;ππππbeginπ  SDStr:= '';π  SNStr:= '';π  SEStr:= '';π  DDStr:= '';π  DNStr:= '';π  DEStr:= '';π  For i:=0 to 32 do SubDirStr[i]:='';π  ExPar;π  ExeMove;πend.π                                                                                 11     05-28-9313:35ALL                      SWAG SUPPORT TEAM        Move File #2             IMPORT              7      ▐Så{ {π> How would I move a File from within my Program.ππif the File is to moved from & to the same partition,πall you have to do is:ππ  Assign(F,OldPath);π  Rename(F,NewPath);ππOn the other hand, if the File is to be moved to a differentπpartition, you will have to copy / erase the File.πExample:π}πProgram MoveFile;ππVarπ  fin,fout  : File;π  p         : Pointer;π  w         : Word;ππbeginπ  GetMem(p,64000);π  Assign(fin,ParamStr(1));               { Assumes command line parameter. }π  Assign(fout,ParamStr(2));π  Reset(fin);π  ReWrite(fout);π  While not Eof(fin) doπ  beginπ    BlockRead(fin,p^,64000,w);π    BlockWrite(fout,p^,w);π  end;π  Close(fin);π  Close(fout);π  Erase(fin);π  FreeMem(p,64000);πend.ππ{πThis Program has NO error control.π}                   12     05-28-9313:35ALL                      SWAG SUPPORT TEAM        Move File FAST           IMPORT              13     ▐SÇ {$S-,R-,V-,I-,N-,B-,F-}ππ{$IFNDEF Ver40}π  {Allow overlays}π  {$F+,O-,X+,A-}π{$ENDIF}ππUNIT MoveFile;ππINTERFACEππUSES Dos;ππFUNCTION MoveFiles ( VAR OldFullPath : PathStr;π                     VAR NewFullPath : PathStr) : BOOLEAN;ππIMPLEMENTATIONπππFUNCTION MoveFiles ( VAR OldFullPath : PathStr;π                     VAR NewFullPath : PathStr) : BOOLEAN;ππVARπ  regs : REGISTERS;π  Error_Return,π  N      : BYTE;ππ  PROCEDURE MoveToNewPath;π  { On same disk drive }π  BEGINπ  OldFullPath [LENGTH (OldFullPath) + 1] := CHR (0);π  NewFullPath [LENGTH (NewFullPath) + 1] := CHR (0);π  WITH regs DOπ    BEGINπ      DS := SEG (OldFullPath);π      DX := OFS (OldFullPath) + 1;  {the very first byte is the length}π      ES := SEG (NewFullPath);π      DI := OFS (NewFullPath) + 1;π      AX := $56 SHL 8;               { ERRORS are             }π      INTR ($21, regs);                {   2 : file not found   }π      IF Flags AND 1 = 1 THEN        {   3 : path not found   }π        error_return := AX           {   5 : access denied    }π      ELSE                           {  17 : not same device  }π        error_return := 0;π    END;  {with}π  END;ππBEGINπ  Error_Return := 0;π  IF OldFullPath [1] = '\' THEN OldFullPath := FExpand (OldFullPath);π  IF NewFullPath [1] = '\' THEN NewFullPath := FExpand (NewFullPath);π  IF UPCASE (OldFullPath [1]) = UPCASE (NewFullPath [1]) THEN MoveToNewPathπ     ELSE Error_Return := 17;ππMoveFiles := (Error_Return = 0);πEND;ππEND.                                                                     13     05-28-9313:35ALL                      SWAG SUPPORT TEAM        Rename File #1           IMPORT              6      ▐S╡╪ {π> Does anybody know how to do a "fast" move of a File?π> ie: not copying it but just moving the FAT Recordππ  Yup.  In Pascal you can do it With the Rename command.  The Format is:ππ   Rename (Var F; NewName : String)ππwhere F is a File Variable of any Type.ππto move a File Really fast, and to avoid having to copy it somewhere first andπthen deleting the original, do this:π}ππProcedure MoveIt;  {No error checking done}πVarπ   F : File;π   FName : String;π   NName : String;πbeginπ   Assign (F, FName);π   NName:= {new directory / File name}π   Rename (F, NName);πEnd.                                                                   14     05-28-9313:35ALL                      SWAG SUPPORT TEAM        Rename File #2           IMPORT              14     ▐S>ò {π>I am interested in the source in Assembler or TP to move a File from oneπ>directory to another by means of the FAT table.  I have seen severalπ>small utilities to do this but I was unable to understand them afterπ>reverse engineering/disassembly.  (Don't worry, they were PD).  <G>π>Anyway, any help would be appreciated.  Thanks.ππYou don't Really need to do much. Dos Interrupt (21h), Function 56h, willπrename a File, and in essence move it if the source and destinationπdirectories are not the same. That's all there is to it. I know Functionπ56h is available in Dos 3.3 and above. I am not sure about priorπversions.ππOn entry: AH      56Hπ          DS:DX   Pointer to an ASCIIZ String containing the drive, path,π                  and Filename of the File to be renamed.π          ES:DI   Pointer to an ASCIIZ String containing the new path andπ                  FilenameπOn return AX      Error codes if carry flag set, NONE if carry flag not setππBelow is some crude TP code I Typed on the fly. It may not be exactly rightπbut you get the idea.π}ππUsesπ  Dos;πVarπ  Regs        : Registers;π  Source,π  Destination : PathStr;ππbeginπ  { Add an ASCII 0 at the end of the Strings to male them ASCIIZπ    Strings, without actually affecting their actual lengths }π  Source[ord(Source[0])] := #0;π  Destination[ord(Destination[0])] := #0;ππ  { Set the Registers }π  Regs.AH := $56;π  Regs.DS := Seg(Source[1]);π  Regs.DX := ofs(Source[1]);π  Regs.ES := Seg(Destination[1]);π  Regs.DI := ofs(Destination[1]);ππ  { Do the Interrupt }π  Intr($21,Regs);πend.π                                                                                                      15     05-28-9313:35ALL                      SWAG SUPPORT TEAM        Move File with Rename    IMPORT              8      ▐S'╠ {π│ I am interested in the source in Asm or TP to move a File from oneπ│ directory to another by means of the FAT table.ππAll you have to do is use the Rename Procedure.  It isn't done via theπFAT table, but via Dos Function 56h.  The only restrictions are (1)πyou must be running on Dos 2.0 or greater, and (2) the original andπtarget directories must be on the same drive.  The code might lookπsomething like this:π}ππFunction MoveFile( FileName, NewDir: Dos.PathStr ): Boolean;πVarπ  f:      File;π  OldDir: Dos.DirStr;π  Nam:    Dos.NameStr;π  Ext:    Dos.ExtStr;πbeginπ  Dos.FSplit( FileName, OldDir, Nam, Ext );π  if NewDir[ Length(NewDir) ] <> '\' thenπ    NewDir := NewDir + '\';π  {$I-}π  Assign( f, FileName );π  FileName := NewDir + Nam + Ext;π  Rename( f, FileName );π  MoveFile := (Ioresult=0);π  {$I+}πend; { MoveFile }π                                                              16     06-22-9307:50ALL                      SWAG SUPPORT TEAM        Copy/Move Files Anywhere IMPORT              49     ▐Sö▌ {$A+,B-,D+,E+,F-,G+,I+,L+,N-,O-,P-,Q-,R-,S-,T-,V-,X+,Y+}π{$M 16384,0,655360}ππUSES DOS,Crt;ππ   TYPEππ   { Define action type MOVE or COPY }π   cTYPE = (cMOVE,cCOPY);ππ   { Define the special structure of a DOS Disk Transfer Area (DTA) }π   DTARec      =  RECORDπ                     Filler   :  ARRAY [1..21] OF BYTE;π                     Attr     :  BYTE;π                     Time     :  WORD;π                     Date     :  WORD;π                     Size     :  LONGINT;π                     Name     :  STRING [12];π                  END {DtaRec};ππVARπ    OK : Integer;π    IP,OP : PathStr;  { input,output file names }ππ   FUNCTION Copier (cWhat : cTYPE; VAR orig: STRING;VAR nName: STRING) : Integer;ππ   { Copy or Move file through DOS if not on same disk. Retain original date,π     time and size and delete the original on Move.  The beauty here is thatπ     we can move files across different drives.  Also, we can rename file ifπ     we choose.     If error, function returns error number }πππ      CONST bufsize = $C000;            { About 48 KB - 49152 }ππ      TYPEπ       fileBuffer = ARRAY [1..bufsize] OF BYTE;ππ      VAR   Regs: registers;π            src,dst: INTEGER;π            bsize,osize: LONGINT;π            buffer : ^fileBuffer;π            DTABlk : DTARec;π            fError : BOOLEAN;ππ      FUNCTION CheckError(err : Integer) : BOOLEAN;π      BEGINπ      CheckError := (Err <> 0);π      fError     := (Err <> 0);π      Copier     := err;π      END;ππ      PROCEDURE delfile (VAR fName: STRING);ππ         VAR   Regs: registers;ππ         BEGINπ            WITH Regs do BEGINπ               ah := $43;             { Make file R/W for delete }π               al := 1;π               cx := 0;               { Normal file }π               ds := Seg(fName[1]);   { fName is the fully qualified }π               dx := Ofs(fName[1]);   { pathname of file, 0 terminated }π               MsDos (Regs);π               IF CheckError(Flags AND 1) THEN EXITπ               ELSE BEGINπ                  ah := $41;            { Delete file through fName }π                  { ds:dx stil valid from set-attributes }π                  MsDos (Regs);π                  IF CheckError(Flags AND 1) THEN EXIT;π                  ENDπ               ENDπ         END;ππ      BEGINππ         Copier := 0;  { Assume Success }π         FindFirst(Orig,Anyfile,SearchRec(DTABlk));π         IF CheckError(DosError) THEN EXIT;ππ         WITH Regs DO BEGINπ            ah := $3D;                  { Open existing file }π            al := 0;                    { Read-only }π            ds := Seg(orig[1]);         { Original filename (from) }π            dx := Ofs(orig[1]);π            MsDos (Regs);π            IF CheckError(Flags AND 1) THEN Exitπ            ELSE BEGINπ               src := ax;               { Handle of the file }ππ               ah := $3C;               { Create a new file }π               cx := 0;                 { Start as normal file }π               ds := Seg(nName[1]);     { Pathname to move TO }π               dx := Ofs(nName[1]);π               MsDos (Regs);π               IF CheckError(Flags AND 1) THEN Exitπ               ELSEπ                  dst := axπ               ENDπ            END;ππ         osize := DTABlk.size;       { Size of file, from "findfirst" }π         WHILE (osize > 0) AND NOT ferror DO BEGINππ            IF osize > bufsize THENπ               bsize := bufsize        { Too big for buffer, use buffer size }π            ELSEπ               bsize := osize;ππ            IF BSize > MAXAVAIL THEN BSize := MAXAVAIL;ππ            GETMEM (buffer, BSize);    { Grap some HEAP memory }ππ            WITH Regs DO BEGINπ               ah := $3F;               { Read block from file }π               bx := src;π               cx := bsize;π               ds := Seg(buffer^);π               dx := Ofs(buffer^);π               MsDos (Regs);π               IF CheckError(Flags AND 1) THEN {}π               ELSE BEGINπ                  ah := $40;            { Write block to file }π                  bx := dst;π                  { cx and ds:dx still valid from Read }π                  MsDos (Regs);π                  IF CheckError(Flags AND 1) THEN {}π                  ELSE IF ax < bsize THENπ                     BEGINπ                     CheckError(98); { disk full }π                     ENDπ                  ELSEπ                     osize := osize - bsizeπ                  END;π               END;ππ            FREEMEM (buffer, BSize);   { Give back the memory }π            END;ππ         IF NOT ferror AND (cWHAT = cMOVE) THENπ         WITH Regs DOπ            BEGINπ            ah := $57;                  { Adjust date and time of file }π            al := 1;                    { Set date }π            bx := dst;π            cx := DTABlk.time;          { Out of the "find" }π            dx := DTABlk.date;π            MsDos (Regs);π            CheckError(Flags AND 1);π            END;ππ         WITH Regs DOπ            BEGINπ            ah := $3E;                  { Close all files, even with errors! }π            bx := src;π            MsDos (Regs);π            ferror := ferror OR ((flags AND 1) <> 0);π            ah := $3E;π            bx := dst;π            MsDos (Regs);π            ferror := ferror OR ((flags AND 1) <> 0)π            END;ππ         IF ferror THEN EXIT            { we had an error somewhere }π         ELSE WITH Regs DOπ            BEGINπ            ah := $43;                  { Set correct attributes to new file }π            al := 1;                    { Change attributes }π            cx := DTABlk.attr;          { Attribute out of "find" }π            ds := Seg(nName[1]);π            dx := Ofs(nName[1]);π            MsDos (Regs);π            IF CheckError(Flags AND 1) THEN EXITπ            ELSEπ               If (cWHAT = cMOVE) THEN DelFile (orig) { Now delete the original }π            END                                       { if we are moving file }π      END;ππBEGINπclrscr;πIP := 'queen1.PAS';πOP := 'd:\temp\queen1.pas';πOK := Copier(cCOPY,IP,OP);πWriteLn(OK);πEND.                                                                17     08-17-9308:42ALL                      SWAG SUPPORT TEAM        An OOP FILECOPY          IMPORT              13     ▐SÇ( PROGRAM FileCopyDemo;     { FILECOPY.PAS }ππUSES Crt;ππTYPEπ   Action  = (Input, Output);π   DataBlk = array[1..512] of byte;π   FileObj = OBJECTπ     fp : FILE;π     CONSTRUCTOR OpenFile(FileName: string;π               FileAction: Action);π     PROCEDURE ReadBlock(VAR fb: DataBlk;π                VAR Size: integer);π     PROCEDURE WriteBlock(fb: DataBlk;π                size: integer);π     DESTRUCTOR CloseFile;π   END;ππCONSTRUCTOR FileObj.OpenFile;πBEGINπ  Assign(fp, FileName);π  CASE FileAction ofπ    Input: BEGINπ      Reset(fp, 1);π      IF IOResult <> 0 THENπ    BEGINπ      WriteLn(FileName, ' not found!');π      Halt(1);π    END;π    WriteLn(FileName,' opened for read ... ');π      END;π    Output: BEGINπ      Rewrite(fp, 1);π      WriteLn(FileName,' opened for write ... ');π      END;π   END; {CASE}πEND;ππDESTRUCTOR FileObj.CloseFile;πBEGINπ   Close(fp);π   WriteLn('File closed ...');πEND;ππPROCEDURE FileObj.ReadBlock;πBEGINπ   BlockRead(fp, fb, SizeOf(fb), Size);π   WriteLn('Reading ', Size, ' bytes ... ');πEND;ππPROCEDURE FileObj.WriteBlock;πBEGINπ   BlockWrite(fp, fb, Size);π   WriteLn('Writing ', Size, ' bytes ... ');πEND;ππVARπ   InFile, OutFile : FileObj;π   Data: DataBlk;π   Size: integer;ππBEGINπ   ClrScr;π   InFile.OpenFile('FILECOPY.PAS', Input);π   OutFile.OpenFile('FILECOPY.CPY', Output);π   REPEATπ      InFile.ReadBlock(Data, Size);π      OutFile.WriteBlock(Data, Size);π   UNTIL Size <> SizeOf(DataBlk);π   InFile.CloseFile;π   OutFile.CloseFile;π   Write('Press Enter to quit ... ');π   ReadLn;πEND.π                                     18     08-27-9320:52ALL                      MARK LEWIS               Copy file in EMS         IMPORT              21     ▐SB| { MARK LEWIS }ππPROGRAM EMSCopy;ππUSESπ  Objects;  {The Object unit is need to access TStream}ππVARπ  InFile,π  OutFile   : PStream;       {Pointer to InPut/OutPut Files}π  EmsStream : PStream;       {Pointer to EMS Memory Block}π  InPos     : LongInt;       {Where are we in the Stream}ππBEGINπ  Writeln;π  Writeln('                  EMSCopy v1.00');π  Writeln;π  Writeln('{ Mangled together from code in the FIDO PASCAL Echo }');π  Writeln('{ Assembled by Mark Lewis                            }');π  Writeln('{ Some ideas and code taken from examples by         }');π  Writeln('{ DJ Murdoch and Todd Holmes                         }');π  Writeln('{ Released in the Public Domain                      }');π  Writeln;π  If ParamCount < 2 Thenπ  Beginπ    Writeln('Usage: EMSCopy <Source_File> <Destination_File>');π    Halt(1);π  End;ππ  Infile := New(PBufStream, init(paramstr(1), stOpenRead, 4096));π  If (InFile^.Status <> stOK) Thenπ  Beginπ    Writeln(#7, 'Error! Source File Not Found!');π    InFile^.Reset;π    Dispose(InFile, Done);π    Halt(2);π  End;ππ  Outfile := New(PBufStream, init(paramstr(2), stCreate, 4096));π  If (OutFile^.Status <> stOK) Thenπ  Beginπ    Writeln(#7,'Error! Destination File Creation Error!');π    OutFile^.Reset;π    Dispose(OutFile, Done);π    Halt(3);π  End;ππ  EmsStream := New(PEmsStream, Init (16000, InFile^.GetSize));π  If (EmsStream^.Status <> stOK) Thenπ  Beginπ    Writeln(#7, 'Error! EMS Allocation Error!');π    Writeln('At Least One Page of EMS Required :(');π    EmsStream^.Reset;π    Dispose(EmsStream, Done);π    Halt(4);π  End;ππ  Writeln('InPut File Size : ', InFile^.Getsize : 10, ' Bytes');π  InPos := EmsStream^.GetSize;π  Repeatπ    Write('Filling EMS Buffer...     ');π    EmsStream^.CopyFrom(InFile^, InFile^.GetSize - InPos);π    if (EmsStream^.Status <> stOK) thenπ      EmsStream^.Reset;ππ    InPos := InPos + EmsStream^.GetSize;π    Write(EmsStream^.GetSize : 10, ' Bytes   ');π    EmsStream^.Seek(0);π    Write('Writing DOS File... ');π    OutFile^.CopyFrom(EmsStream^, EmsStream^.GetSize);π    Writeln(OutFile^.Getsize : 10, ' Bytes');π    If (InFile^.Status <> stOK) Thenπ      InFile^.Reset;π    If (OutFile^.GetSize < InFile^.GetSize) Thenπ    Beginπ      EmsStream^.Seek(0);π      EmsStream^.Truncate;π      InFile^.Seek(InPos);π    End;π  Until (OutFile^.GetSize = InFile^.GetSize);π  Writeln('Done!');π  DISPOSE(InFile, Done);π  DISPOSE(OutFile, Done);π  DISPOSE(EmsStream, Done);πEND.π                                                                                                    19     10-28-9311:33ALL                      GUY MCLOUGHLIN           File Copy Routine        IMPORT              114    ▐S╖> π              (* Compiler directives.                               *)π {$A+,B-,D-,E-,F-,I+,N-,O-,R-,S-,V+}ππ              (* STACK, HEAP memory directives.                     *)π {$M 1024, 0, 0}ππ              (* Public domain file-copy program.                   *)π              (* Guy McLoughlin - August 23, 1992.                  *)πprogram MCopy;ππuses          (* We need this unit for the paramcount, paramstr,    *)π  Dos;        (* fsearch, fexpand, fsplit routines.                 *)ππconstπ              (* Carridge-return + Line-feed constant.              *)π  coCrLf = #13#10;ππ              (* Size of the buffer we're going to use.             *)π  coBuffSize = 61440;ππtypeπ              (* User defined file read/write buffer.               *)π  arBuffSize = array[1..coBuffSize] of byte;ππvarπ              (* Path display width.                                *)π  byDispWidth : byte;ππ              (* Variable to record the number of files copied.     *)π  woCopyCount,π              (* Variable to record the number of bytes read.       *)π  woBytesRead,π              (* Variable to record the number of bytes written.    *)π  woBytesWritten : word;ππ              (* Variable to record the size in bytes of IN-file.   *)π  loInSize,π              (* Variable to record the number of bytes copied.     *)π  loByteProc : longint;ππ              (* Variables for TP "Fsplit" routine.                 *)π  stName : namestr;π  stExt  : extstr;ππ              (* Directory-string variables.                        *)π  stDirTo,π  stDirFrom : dirstr;ππ              (* Path-string variables.                             *)π  stPathTo,π  stPathFrom,π  stPathTemp : pathstr;ππ              (* Array used to buffer file reads/writes.            *)π  arBuffer : arBuffSize;ππ              (* Directory search-record.                           *)π  rcSearchTemp : searchrec;ππ              (* IN file-variable.                                  *)π  fiIN,π              (* OUT file-variable.                                 *)π  fiOUT : file;πππ   (***** Handle file errors.                                       *)π   procedure ErrorHandler( byErrorNum : byte);π   beginπ     case byErrorNum ofππ       1 : beginπ             writeln(coCrLf, ' (SYNTAX) MCOPY <path1><filespec1>' +π                             ' <path2><filename2>');π             writeln(coCrLf, ' (USAGE)  MCOPY c:\utils\*.doc' +π                             ' c:\temp\master.doc');π             writeln('          MCOPY   \utils\*.doc    ' +π                     '\temp\master.doc');π             writeln(coCrLf, ' (Copies all files with the ''.doc''' +π                             ' extension from ''c:\utils'')');π             writeln(' (directory, to ''master.doc'' in the ' +π                     '''c:\temp'' directory.    )');π             writeln(coCrLf, ' ( Public-domain utility by Guy ' +π                     'McLoughlin  \  August 1992  )')π           end;ππ       2 : writeln(coCrLf,π                  ' Error : <path1><filespec1> = <path2><filename2>');ππ       3 : writeln(coCrLf, ' Directory not found ---> ', stDirFrom);ππ       4 : writeln(coCrLf, ' Directory not found ---> ', stDirTo);ππ       5 : writeln(coCrLf, ' Error opening ---> ', stPathTo);ππ       6 : writeln(coCrLf, ' File copy aborted');ππ       7 : writeln(coCrLf, ' Error creating ---> ', stPathTo);ππ       8 : writeln(coCrLf, ' Error opening ---> ', stPathTemp);ππ       9 : writeln(coCrLf, ' Error with disk I/O ')ππ     end;     (* case byErrorNum.                                   *)ππ     haltπ   end;       (* ErrorHandler.                                      *)πππ   (***** Determine if a file exists.                               *)π   function FileExist(FileName : pathstr) : boolean;π   beginπ     FileExist := (FSearch(FileName, '') <> '')π   end;       (* FileExist.                                         *)πππ   (***** Determine if a directory exists.                          *)π   function DirExist(stDir : dirstr) : boolean;π   varπ     woFattr : word;π     fiTemp  : file;π   beginπ     assign(fiTemp, (stDir + '.'));π     getfattr(fiTemp, woFattr);π     if (doserror <> 0) thenπ       DirExist := falseπ     elseπ       DirExist := ((woFattr and directory) <> 0)π   end;       (* DirExist.                                          *)πππ   (***** Clear the keyboard-buffer.                                *)π   procedure ClearKeyBuff; assembler;π   asmπ     @1: mov ah, 01hπ         int 16hπ         jz  @2π         mov ah, 00hπ         int 16hπ         jmp @1π     @2:π   end;       (* ClearKeyBuff                                       *)πππ   (***** Read a key-press.                                         *)π   function ReadKeyChar : char; assembler;π   asmπ     mov ah, 00hπ     int 16hπ   end;        (* ReadKeyChar.                                      *)πππ   (***** Obtain user's choice.                                     *)π   function UserChoice : char;π   varπ     Key : char;π   beginπ     ClearKeyBuff;π     repeatπ       Key := upcase(ReadKeyChar)π     until (Key in ['A', 'O', 'Q']);π     writeln(Key);π     UserChoice := Keyπ   end;       (* UserChoice.                                        *)πππ   (***** Returns all valid wildcard names for a specific directory.*)π   (*     When the last file is found, the next call will return an *)π   (*     empty string.                                             *)π   (*                                                               *)π   (* NOTE: Standard TP DOS unit must be listed in your program's   *)π   (*       "uses" directive, for this routine to compile.          *)ππ   function WildCardNames({ input}     stPath   : pathstr;π                                       woAttr   : word;π                          {update} var stDir    : dirstr;π                                   var rcSearch : searchrec)π                          {output}              : pathstr;π   varπ              (* Fsplit variables.                                  *)π     stName : namestr;π     stExt  : extstr;π   beginπ              (* If the search-record "name" field is empty, then   *)π              (* initialize it with the first matching file found.  *)π     if (rcSearch.name = '') thenπ       beginπ              (* Obtain directory-string from passed path-string.   *)π         fsplit(stPath, stDir, stName, stExt);ππ              (* Find first match of path-string.                   *)π         findfirst(stPath, woAttr, rcSearch);ππ              (* If a matching file was found, then return full     *)π              (* path-name.                                         *)π         if (doserror = 0) and (rcSearch.name <> '') thenπ           WildCardNames := (stDir + rcSearch.name)π         elseπ              (* No match found, return empty string.               *)π           WildCardNames := ''π       endπ     elseπ              (* Search-record "name" field is not empty, so        *)π              (* continue searching for matches.                    *)π       beginπ         findnext(rcSearch);ππ              (* If no error occurred, then match was found...      *)π         if (doserror = 0) thenπ           WildCardNames := (stDir + rcSearch.name)π         elseπ              (* No match found. Re-set search-record "name" field, *)π              (* and return empty path-string.                      *)π           beginπ             rcSearch.name := '';π             WildCardNames := ''π           endπ       endπ   end;πππ   (***** Pad a string with extras spaces on the right.             *)π   function PadR(stIn : string; bySize : byte) : string;π   beginπ     fillchar(stIn[succ(length(stIn))], (bySize - length(stIn)) ,' ');π     inc(stIn[0], (bySize - length(stIn)));π     PadR := stInπ   end;       (* PadR.                                              *)πππ              (* Main program execution block.                      *)πBEGINπ              (* If too many or too few parameters, display syntax. *)π  if (paramcount <> 2) thenπ    ErrorHandler(1);ππ              (* Assign program parameters to string variables.     *)π  stPathFrom := paramstr(1);π  stPathTo   := paramstr(2);ππ              (* Make sure full path-string is used.                *)π  stPathFrom := fexpand(stPathFrom);π  stPathTo   := fexpand(stPathTo);π  stPathTemp := stPathFrom;ππ              (* Check if IN-Filename is the same as OUT-Filename.  *)π  if (stPathFrom = stPathTo) thenπ    ErrorHandler(2);ππ              (* Seperate directory-strings from path-strings.      *)π  fsplit(stPathFrom, stDirFrom, stName, stExt);π  fsplit(stPathTo, stDirTo, stName, stExt);ππ              (* Make sure that "From" directory exists.            *)π  if NOT DirExist(stDirFrom) thenπ    ErrorHandler(3);ππ              (* Make sure that "To" directory exists.              *)π  if NOT DirExist(stDirTo) thenπ    ErrorHandler(4);ππ              (* Determine the full path display width.             *)π  if (stDirFrom[0] > stDirTo[0]) thenπ    byDispWidth := length(stDirFrom) + 12π  elseπ    byDispWidth := length(stDirTo) + 12;ππ              (* Check if the OUT-File does exist, then...          *)π  if FileExist(stPathTo) thenπ    beginπ              (* Ask if user wants to append/overwrite file or quit.*)π      writeln(coCrLf, ' File exists ---> ', stPathTo);π      write(coCrLf, ' Append / Overwrite / Quit  [A,O,Q]? ');ππ              (* Obtain user's response.                            *)π      case UserChoice ofπ        'A' : beginπ              (* Open the OUT-file to write to it.                  *)π                assign(fiOUT, stPathTo);π                {$I-}π                reset(fiOUT, 1);π                {$I+}ππ              (* If there is an error opening the OUT-file, inform  *)π              (* the user of it, and halt the program.              *)π                if (ioresult <> 0) thenπ                  ErrorHandler(5);ππ              (* Seek to end of file, so that data can be appended. *)π                seek(fiOUT, filesize(fiOUT))π              end;ππ        'O' : beginπ              (* Open the OUT-file to write to it.                  *)π                assign(fiOUT, stPathTo);π                {$I-}π                rewrite(fiOUT, 1);π                {$I+}ππ              (* If there is an error opening the OUT-file, inform  *)π              (* the user of it, and halt the program.              *)π                if (ioresult <> 0) thenπ                  ErrorHandler(5)π              end;ππ        'Q' : ErrorHandler(6)ππ      end     (* case UserChoice.                                   *)ππ    endππ  else        (* OUT-file does not exist.                           *)ππ    beginπ              (* Create the OUT-file to write to.                   *)π      assign(fiOUT, stPathTo);π      {$I-}π      rewrite(fiOUT, 1);π      {$I+}ππ              (* If there is an error creating the OUT-file, inform *)π              (* the user of it, and halt the program.              *)π      if (ioresult <> 0) thenπ        ErrorHandler(7)π    end;ππ              (* Clear the search-record, before begining.          *)π  fillchar(rcSearchTemp, sizeof(rcSearchTemp), 0);ππ              (* Initialize copy-counter.                           *)π  woCopyCount := 0;ππ              (* Set current file-mode to "read-only".              *)π  filemode := 0;ππ  writeln;ππ              (* Repeat... ...Until (stPathTemp = '').              *)π  repeatπ              (* Search for vaild filenames.                        *)π    stPathTemp := WildCardNames(stPathTemp, archive, stDirFrom,π                                rcSearchTemp);ππ              (* If file search was successful, then...             *)π    if (stPathTemp <> '') thenπ      beginπ              (* Open the IN-file to read it.                       *)π        assign(fiIN, stPathTemp);π        {$I-}π        reset(fiIN, 1);π        {$I+}ππ              (* If there is an error opening the IN-file, inform   *)π              (* the user of it, and halt the program.              *)π        if (ioresult <> 0) thenπ          beginπ            close(fiOUT);π            erase(fiOUT);π            ErrorHandler(8)π          end;ππ              (* Determine the size of the IN-file.                 *)π        loInSize := filesize(fiIN);ππ              (* Set the number of bytes processed to 0.            *)π        loByteProc := 0;ππ              (* Repeat... ...Until the IN-file has been completely *)π              (* copied.                                            *)π        repeatππ              (* Read the IN-file into the file-buffer.             *)π          blockread(fiIN, arBuffer, coBuffSize, woBytesRead);ππ              (* Write the file-buffer to the OUT-file.             *)π          blockwrite(fiOUT, arBuffer, woBytesRead, woBytesWritten);ππ              (* If there is a problem writing the bytes to the     *)π              (* OUT-file, let the user know, and halt the program. *)π          if (woBytesWritten <> woBytesRead) thenπ            beginπ              close(fiIN);π              close(fiOUT);π              erase(fiOut);π              ErrorHandler(9)π            endπ          elseπ              (* Advance the bytes-processed variable by the        *)π              (* number of bytes written to the OUT-file.           *)π            inc(loByteProc, woBytesWritten)ππ              (* Repeat... ...Until the complete IN-file has been   *)π              (* processed.                                         *)π        until (loByteProc = loInSize);ππ              (* Close the IN-file that has been copied.            *)π        close(fiIN);ππ              (* Increment copy-counter by 1.                       *)π        inc(woCopyCount);ππ              (* Let the user know that we've finished copying file.*)π        writeln(' ', PadR(stPathTemp, byDispWidth),' COPIED TO ---> ',π                stPathTo);ππ      end     (* If (stPathTemp <> '') then...                      *)ππ              (* Repeat... ...Until no more files are found.        *)π  until (stPathTemp = '');ππ              (* Close the OUT-file.                                *)π  close(fiOUT);ππ              (* Display the number of files copied.                *)π  if (woCopyCount = 0) thenπ    beginπ      erase(fiOut);π      writeln(coCrLf, ' No matching files found ---> ', stPathFrom)π    endπ  elseπ    writeln(coCrLf, ' ', woCopyCount, ' Files copied')πEND.πππ                              20     11-02-9317:51ALL                      IAN LIN                  Simple File Copy         IMPORT              10     ▐Sæ {πFrom: IAN LINπTo just copy files, use buffers on the heap. Just make an array type that'sπalmost 64k in size. Use as many of these as needed that can fit in RAM andπblockread the data in. After you blockread all you can, close the file ifπit's been fully read in. If it hasn't then don't close the input file yet.πNext you open the output file and dump everything in each buffer withπblockwrite. If you're done now, close both files, otherwise keep readingπall you can at once from the input file and blockwriting it to the outputπfile. }ππtypeπ pbuf=^buf;π buf=recordπ  n:pbuf;π  b:array [1..65530] of byte;π end;πvarπ buffer,bufp:pbuf;π bufc:byte;π outf,f:file;πbeginπ bufp:=new(buffer);π assign(f,'IT');π reset(f,1);π blockread(f,bufp^,sizeof(bufp^);π assign(outf,'OTHER');π rewrite(outf,1);π blockwrite(outf,bufp^,sizeof(bufp^);π close(f);π close(outf);πend.ππThis is just an example so don't expect it to be very useful. :)ππFor text files, if you want to modify them, you may want to use linkedπlists which point to a line at a time. Remove unwanted lines from the list,πand then write it to the output file.π