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

    {
    Hello Gayle!

    As I was working on an installation program and needed build-in
    compression/decompression I found out the sources available in SWAG only
    handled one file at a time thus couldn't create archives. So I created a
    little utility to gather several file into one with the ability to
    seperate them again.

    It can be used for several other things. Just a few weeks ago I presented
    this as a solution to a guy who wanted to create one resource file from
    several datafiles. So I think this might be usefull enough for SWAG :))

    ..SWG to include it in: FILES.SWG
    Subject proposal: Gather several file into one

    The .pas files:
    --------------------------------------------------------- }
    PROGRAM Gather;  { program to extract files at the end !! }

    {Gather v. 1.2

    Archive several file in one, still being able to restore the original
    files.

    Copyright 1996-97 Centennial Innovations by Bruno Olsen,
    All rights reserved.

    LICENCE:

    1. You can distribute this program as long as no fee is charged. 2. You
    can use this source free of charge as long as you agree to 3-5. 3. If
    using this source, you must notify the auther. This will incurrage
       the auther to update the source, and the auther will know if his
    effords
       was worth while.
    4. If modifying this source, you must notify the original auther about the
       modifications, and send the full modified source. NOTE: Send ONLY the
    source
       for THIS program, NOT the source of the program in which this source is
    used. 5. This source may be used in either freeware, shareware or
    commercial
       applications, as long as the author is familiar with the use, see 3-4.

    Author can be contacted through these sources:

    Bulletin Board: Mountain Online Services
                    +45 58841025, +45 58841024

    FidoNet: 2:236/42, 2:236/49

    Internet: bo@vestnet.dk

    Homepage: http://home.vest.net/bo

    Snail mail: Centennial Innovations
                Bruno Olsen
                Fugleveanget 30
                DK-4270 Hoeng
                Denmark

    History:
    Version 1.0    First usable version. Only files with the Archive attribute
                   set is archived.
    Version 1.2    Extended header to hold attribute information. Directories
    are
                   now stored and the files within are too. Limitation of
    Archive
                   files eliminated. Changes in header: Attrib added, DirNum
                   added and Numbers changed from Byte to Integer. Rewritten
                   most of the code to recursive rutines.}

    USES DOS, CRT;

    TYPE HeaderType=RECORD
                     Str:String[12];
                                    {Record 0: Identifying string='GTH_2'
                                     Record 1 and above: File/directory name}
                     Attrib:Array [1..5] of Boolean;
                                    {Attrib: 1   true if   System
                                             2   true if   Hidden
                                             3   true if   Archive
                                             4   true if   ReadOnly
                                             5   true if   Directory}
                     Numbers:Integer;
                                    {Numbers:
                                     Record 0: Amount of files stored.
                                     Record 1 and above: The number of the
                                                         directory.
                                                         The root gather
                                                         directory is 0.
                                     NOT used for files.}
                     DirNum:Integer;
                                    {DirNum:
                                     Record 0: Amount of directories stored.
                                     Record 1 and above: The number of the
                                                         directory the files/
                                                         directories reside
    in.
                                                         The root gather
                                                         directory is 0.}
                     Offsets:LongInt;
                                    {Offsets:
                                     Record 0: Where the header ends.
                                     Record 1 and above: Where the current
    file
                                                         processed ends.
    Previous
                                                         + 1 marks file
    start.}
                    END;

    CONST RecordSize=26;  {The size of header type. Edit this when modifying
    header}
          HeaderName='GTH_2';
          VersionNumber='1.2';
          CYear='1996-97';

    VAR InFiles,
        OutFile:File;
        MainFile:File of HeaderType;
        Main:HeaderType;
        MaxFiles:Byte;
        Last:Byte;
        NumRead, NumWritten: Word;
        Buf: array[1..4000] of Char;
        FSize:LongInt;
        Error:Word;
        TempSize,
        SizeCount:LongInt;
        FileCount,
        DirCount:Integer;
        DirInfo:SearchRec;
        CurrentDir,
        LastDir,
        DirNum,
        InDirNum:Integer;
        StartDir,
        GatherDir,
        GatherFiles,
        GatherTo,
        ConvStr,
        EnvTemp:String;
        ProcDir:Boolean;

    PROCEDURE Get_File_Size(FName : string;
                        var FSize : longint;
                        var Error : word);
    var
      SR    : SearchRec;

    BEGIN
      {$I-}
      FindFirst(FName,Archive,SR);
      Error := DosError;
      {$I+}
      if Error = 0 then
        FSize := SR.Size
      else
        FSize := 0;
    END;

    PROCEDURE CountFiles(VAR DirCount, FileCount:Integer;VAR
    SizeCount:LongInt);

    VAR LastDir:String;

     BEGIN
      FindFirst(GatherFiles, AnyFile-VolumeID, DirInfo);
      while DosError = 0 do
       begin
        IF (DirInfo.Attr=Directory) AND NOT((DirInfo.Name='.') OR
    (DirInfo.Name='..')) THEN
         BEGIN
          DirCount:=DirCount+1;
          ChDir(DirInfo.Name);
          LastDir:=DirInfo.Name;
          CountFiles(DirCount,FileCount,SizeCount);
          ChDir('..');
          FindFirst('*.*', AnyFile-VolumeID, DirInfo); { Same as DIR *.PAS }
          while (DosError = 0) AND NOT(DirInfo.Name=LastDir) do
           begin
            FindNext(DirInfo);
           end;
         END
         ELSE
          IF DirInfo.Attr IN[Archive,ReadOnly,Hidden,SysFile] THEN
           BEGIN
            FileCount:=FileCount+1;
            SizeCount:=SizeCount+DirInfo.Size;
           END;
        FindNext(DirInfo);
       end;
     END;

    PROCEDURE ResetAttrib;

     VAR Counter:Integer;

    BEGIN
     FOR Counter:=1 to 5 DO
      Main.Attrib[Counter]:=False;
    END;

    PROCEDURE SetAttrib;

     VAR Check:Byte;

    BEGIN
     ResetAttrib;
     Check:=DirInfo.Attr;
     IF (Check-32) IN[0,1,2,4,8,16] THEN
      BEGIN
       Check:=Check-32;
       Main.Attrib[3]:=TRUE;
      END;
     IF (Check-16) IN[0,1,2,4,8] THEN
      BEGIN
       Check:=Check-16;
       Main.Attrib[5]:=TRUE;
      END;
     IF (Check-8) IN[0,1,2,4] THEN
      BEGIN
       Check:=Check-8;    {VolumeID is not used}
      END;
     IF (Check-4) IN[0,1,2] THEN
      BEGIN
       Check:=Check-4;
       Main.Attrib[1]:=TRUE;
      END;
     IF (Check-2) IN[0,1] THEN
      BEGIN
       Check:=Check-2;
       Main.Attrib[2]:=TRUE;
      END;
     IF Check-1=0 THEN
      BEGIN
       Main.Attrib[4]:=TRUE;
      END;
    END;

    PROCEDURE AddFile;
    BEGIN
     Assign(InFiles,DirInfo.Name);
     Reset(InFiles,1);
     repeat
      BlockRead(InFiles, Buf, SizeOf(Buf), NumRead);
      BlockWrite(OutFile, Buf, NumRead, NumWritten);
     until (NumRead = 0) or (NumWritten <> NumRead);
     Close(InFiles);
    END;

    PROCEDURE MakeHeader(LastDir:Integer;VAR CurrentDir:Integer);

    VAR LastDirName:String;

     BEGIN
      FindFirst(GatherFiles, AnyFile-VolumeID, DirInfo);
      while DosError = 0 do
       begin
        IF (DirInfo.Attr=Directory) AND NOT((DirInfo.Name='.') OR
    (DirInfo.Name='..')) THEN
         BEGIN
          CurrentDir:=CurrentDir+1;
          DirNum:=CurrentDir;
          InDirNum:=LastDir;
          ChDir(DirInfo.Name);
          LastDirName:=DirInfo.Name;
          Main.Str:=DirInfo.Name;
          WriteLn('Storing directory: '+DirInfo.Name);
          SetAttrib;
          Main.Numbers:=DirNum;
          Main.DirNum:=InDirNum;
          Main.Offsets:=0;
          Write(MainFile,Main);
          MakeHeader(CurrentDir,CurrentDir);
          ChDir('..');
          FindFirst('*.*', AnyFile-VolumeID, DirInfo);
          while (DosError = 0) AND NOT(DirInfo.Name=LastDirName) do
           begin
            FindNext(DirInfo);
           end;
         END
         ELSE IF (DirInfo.Attr<>Directory) AND (DirInfo.Attr<>VolumeID) THEN
          BEGIN
           Main.Str:=DirInfo.Name;
           WriteLn('Storing file: '+DirInfo.Name);
           SetAttrib;
           Main.Numbers:=DirNum;
           Main.DirNum:=InDirNum;
           Main.Offsets:=TempSize+DirInfo.Size;
           TempSize:=Main.Offsets;
           AddFile;
           Write(MainFile,Main);
          END;
        FindNext(DirInfo);
       end;
     END;

    PROCEDURE GetParams;

    VAR Counter:Integer;

     BEGIN
      ProcDir:=FALSE;
      IF ParamCount=0 THEN
       BEGIN
        WriteLn('Usage:');
        WriteLn('GATHER [ -d | -D ] [DirectoryName] InFiles OutFile');
        WriteLn;
        WriteLn('-d or -D     : Gather files and directory structure');
        WriteLn('DirectoryName: Starting directory');
        WriteLn('InFiles      : Files to gather');
        WriteLn('OutFile      : File to gather the files into');
        WriteLn;
        WriteLn('Examples:');
        WriteLn('GATHER *.PAS PASFILES.GTH    Gather all .PAS-files into the file PASFILES.GTH');
        WriteLn('GATHER -D c:\dos *.* DOSDIR.GTH  GATHER all files in c:\dos and all directories');
        WriteLn('                                 and all files in them into the file DOSDIR.GTH');
        Halt(1);
       END
       ELSE
        BEGIN
         Counter:=1;
         IF (ParamStr(Counter)='-d') OR (ParamStr(Counter)='-D') THEN
          BEGIN
           ProcDir:=TRUE;
           Counter:=Counter+1;
          END;
         IF (ParamCount-Counter)=2 THEN
          BEGIN
           GatherDir:=ParamStr(Counter);
           Counter:=Counter+1;
          END
          ELSE
           GatherDir:=StartDir;
         GatherFiles:=ParamStr(Counter);
         GatherTo:=ParamStr(Counter+1);
        END;
     END;

    BEGIN
     CLRSCR;
     WriteLn('Gather version '+VersionNumber+' (C) '+CYear+' Centennial Innovations by Bruno Olsen');
     WriteLn;
     GetDir(0,StartDir); { 0 = Current drive }
     EnvTemp:=GetEnv('TEMP');
     EnvTemp:=EnvTemp+'\';
     DirCount:=0;FileCount:=0;SizeCount:=0;
     GetParams;
     ChDir(GatherDir);
     Write('Analizing... ');
     CountFiles(DirCount,FileCount,SizeCount);
     Str(DirCount,ConvStr);
     Write('Directories: '+ConvStr);
     Str(FileCount,ConvStr);
     Write(' Files: '+ConvStr);
     Str(SizeCount,ConvStr);
     WriteLn(' Bytes: '+ConvStr);
     WriteLn;
     WriteLn('Processing...');
     ChDir(StartDir);
     MaxFiles:=DirCount+FileCount;
     ResetAttrib;
     Main.Str:=HeaderName;
     Main.Numbers:=FileCount;
     Main.DirNum:=DirCount;
     Main.Offsets:=RecordSize*(MaxFiles+1);
     TempSize:=Main.Offsets;
     Assign(MainFile,EnvTemp+'head.tmp');
     Assign(OutFile,EnvTemp+'main.tmp');
     ReWrite(MainFile);
     ReWrite(OutFile);
     Close(OutFile);
     Reset(OutFile,1);
     Write(MainFile,Main);
     CurrentDir:=0;LastDir:=0;
     ChDir(GatherDir);
     MakeHeader(LastDir,CurrentDir);
     ChDir(StartDir);
     Close(MainFile);
     Close(OutFile);
     WriteLn;
     WriteLn('Cleaning up...');
     Assign(InFiles,EnvTemp+'head.tmp');
     Assign(OutFile,GatherTo);
     ReWrite(OutFile);
     Close(OutFile);
     Reset(InFiles,1);
     Reset(OutFile,1);
     repeat
       BlockRead(InFiles, Buf, SizeOf(Buf), NumRead);
       BlockWrite(OutFile, Buf, NumRead, NumWritten);
      until (NumRead = 0) or (NumWritten <> NumRead);
     Close(InFiles);
     Close(OutFile);
     Assign(InFiles,EnvTemp+'main.tmp');
     Assign(OutFile,GatherTo);
     Reset(InFiles,1);
     Reset(OutFile,1);
     Seek(OutFile,FileSize(OutFile));
     repeat
       BlockRead(InFiles, Buf, SizeOf(Buf), NumRead);
       BlockWrite(OutFile, Buf, NumRead, NumWritten);
      until (NumRead = 0) or (NumWritten <> NumRead);
     Close(InFiles);
     Close(OutFile);
     Erase(InFiles);
     Assign(Infiles,EnvTemp+'head.tmp');
     Erase(Infiles);
     ChDir(StartDir);
     WriteLn('Done.');
    END.
    ---------------------------------------------------------
    PROGRAM XTract;

    {Xtract v. 1.2

    Restore files Gathered with Gather v. 1.2.

    Copyright 1996-97 Centennial Innovations by Bruno Olsen,
    All rights reserved.

    LICENCE:

    1. You can distribute this program as long as no fee is charged. 2. You
    can use this source free of charge as long as you agree to 3-5. 3. If
    using this source, you must notify the auther. This will incurrage
       the auther to update the source, and the auther will know if his
    effords
       was worth while.
    4. If modifying this source, you must notify the original auther about the
       modifications, and send the full modified source. NOTE: Send ONLY the
    source
       for THIS program, NOT the source of the program in which this source is
    used. 5. This source may be used in either freeware, shareware or
    commercial
       applications, as long as the author is familiar with the use, see 3-4.

    Author can be contacted through these sources:

    Bulletin Board: Mountain Online Services
                    +45 58841025, +45 58841024

    FidoNet: 2:236/42, 2:236/49

    Internet: bo@vestnet.dk

    Homepage: http://home.vest.net/bo

    Snail mail: Centennial Innovations
                Bruno Olsen
                Fugleveanget 30
                DK-4270 Hoeng
                Denmark

    History:
    Version 1.0    First usable version. Only files with the Archive attribute
                   set is archived.
    Version 1.2    Extended header to hold attribute information. Directories
    are
                   now stored and the files within are too. Limitation of
    Archive
                   files eliminated. Changes in header: Attrib added, DirNum
                   added and Numbers changed from Byte to Integer. Rewritten
                   most of the code.}

    USES DOS, CRT;

    TYPE HeaderType=RECORD
                     Str:String[12];
                                    {Record 0: Identifying string='GTH_2'
                                     Record 1 and above: File/directory name}
                     Attrib:Array [1..5] of Boolean;
                                    {Attrib: 1   true if   System
                                             2   true if   Hidden
                                             3   true if   Archive
                                             4   true if   ReadOnly
                                             5   true if   Directory}
                     Numbers:Integer;
                                    {Numbers:
                                     Record 0: Amount of files stored.
                                     Record 1 and above: The number of the
                                                         directory.
                                                         The root gather
                                                         directory is 0.
                                     NOT used for files.}
                     DirNum:Integer;
                                    {DirNum:
                                     Record 0: Amount of directories stored.
                                     Record 1 and above: The number of the
                                                         directory the files/
                                                         directories reside
    in.
                                                         The root gather
                                                         directory is 0.}
                     Offsets:LongInt;
                                    {Offsets:
                                     Record 0: Where the header ends.
                                     Record 1 and above: Where the current
    file
                                                         processed ends.
    Previous
                                                         + 1 marks file
    start.} {                 Compressed:Boolean;}
                                    {Compressed:
                                     TRUE if the file was compressed,
                                     FALSE if the file was stored.}
                    END;

    CONST RecordSize=26;
          HeaderName='GTH_2';
          VersionNumber='1.2';
          CYear='1996-97';

    VAR InFiles,
        OutFile:File;
        MainFile,
        HeadTemp:File of HeaderType;
        Main:HeaderType;
        Head:HeaderType;
        MaxFiles:Byte;
        Last:Byte;
        NumRead, NumWritten: Word;
        Buf: array[1..2048] of Char;
        FSize,
        Missing,
        EndSize:LongInt;
        Error:Word;
        TempSize,
        SizeCount:LongInt;
        FileCount,
        DirCount:Integer;
        DirInfo:SearchRec;
        CurrentDir,
        LastDir,
        DirNum,
        InDirNum:Integer;
        StartDir,
        XtractDir,
        XtractFrom,
        XtractFiles,
        ConvStr,
        EnvTemp:String;
        ProcDir:Boolean;

    PROCEDURE Get_File_Size(FName : string;
                        var FSize : longint;
                        var Error : word);
    var
      SR    : SearchRec;

    BEGIN
      {$I-}
      FindFirst(FName,Archive,SR);
      Error := DosError;
      {$I+}
      if Error = 0 then
        FSize := SR.Size
      else
        FSize := 0;
    END;

    Function DirExist(st_Dir : DirStr) : Boolean;
    Var
      wo_Fattr : Word;
      fi_Temp  : File;
    begin
      assign(fi_Temp, (st_Dir + '.'));
      getfattr(fi_Temp, wo_Fattr);
      if (Doserror <> 0) then
        DirExist := False
      else
        DirExist := ((wo_Fattr and directory) <> 0)
    end;

    PROCEDURE CountFiles(VAR DirCount, FileCount:Integer;VAR
    SizeCount:LongInt);

    VAR LastDir:String;
        Counter:Integer;

     BEGIN
      Get_File_Size(XtractFrom,FSize,Error);
      Assign(MainFile,XtractFrom);
      Reset(MainFile);
      Assign(HeadTemp,EnvTemp+'head.tmp');
      ReWrite(HeadTemp);
      Read(MainFile,Main);
      MaxFiles:=Main.Numbers+Main.DirNum;
      TempSize:=RecordSize*(Maxfiles+1);
      SizeCount:=FSize-TempSize;
      DirCount:=Main.DirNum;
      FileCount:=Main.Numbers;
      Write(HeadTemp,Main);
      FOR Counter:=1 TO MaxFiles DO
       BEGIN
        Read(MainFile,Main);
        Write(HeadTemp,Main);
       END;
      Close(MainFile);
      Close(HeadTemp);
      Assign(MainFile,EnvTemp+'head.tm2');
      Reset(HeadTemp);
      ReWrite(MainFile);
      While NOT(EOF(HeadTemp)) DO
       BEGIN
        Read(HeadTemp,Main);
        Write(MainFile,Main);
       END;
     END;

    PROCEDURE ResetAttrib;

     VAR Counter:Integer;

    BEGIN
     FOR Counter:=1 to 5 DO
      Main.Attrib[Counter]:=False;
    END;

    PROCEDURE SetAttrib;

     VAR Check:Word;

    BEGIN
     Check:=0;
     IF Main.Attrib[3]=TRUE THEN
       Check:=Check+Archive;
     IF Main.Attrib[1]=TRUE THEN
       Check:=Check+SysFile;
     IF Main.Attrib[2]=TRUE THEN
       Check:=Check+Hidden;
     IF Main.Attrib[4]=TRUE THEN
       Check:=Check+ReadOnly;
     SetFAttr(OutFile,Check);
    END;

    PROCEDURE MakeFile;
    BEGIN
     Write('Xtracting file: '+Main.Str+' ');
     Assign(OutFile,Main.Str);
     ReWrite(OutFile);
     Close(OutFile);
     EndSize:=Main.Offsets-TempSize;
     IF EndSize>2048 THEN
      BEGIN
       repeat
        BlockRead(InFiles, Buf, SizeOf(Buf), NumRead);
        Reset(OutFile,1);
        Seek(OutFile,FileSize(OutFile));
        BlockWrite(OutFile, Buf, NumRead, NumWritten);
        Close(OutFile);
        Get_File_Size(Main.Str,FSize,Error);
       until (EndSize-FSize)<2048;
       Missing:=EndSize-FSize;
      END ELSE Missing:=EndSize;
     BlockRead(InFiles,Buf,Missing,NumRead);
     Reset(OutFile,1);
     Seek(OutFile,FileSize(OutFile));
     BlockWrite(OutFile,Buf,Missing,NumWritten);
     Close(OutFile);
     SetAttrib;
     WriteLn('Ok');
    END;

    PROCEDURE ReadHeader(LastDir:Integer;VAR CurrentDir:Integer);

    VAR LastDirName:String;
        Counter:Integer;
        DoneThis:Boolean;

     BEGIN
      Assign(HeadTemp,EnvTemp+'head.tm2');
      CurrentDir:=0;
      Counter:=1;
      While NOT(EOF(MainFile)) DO
       BEGIN
        Read(MainFile,Main);
        IF Main.Attrib[5] THEN
         BEGIN
          Write('Xtracting directory: '+Main.Str+' ');
          IF Main.DirNum=CurrentDir THEN
           BEGIN
            IF NOT(DirExist(Main.Str)) THEN MkDir(Main.Str);
            ChDir(Main.Str);
            CurrentDir:=Main.Numbers;
            Counter:=Counter+1;
            WriteLn('Ok');
           END
            ELSE
             BEGIN
              Write('Searching... ');
              LastDir:=CurrentDir;
              REPEAT
               Reset(HeadTemp);
               Read(HeadTemp,Head);
               While NOT(EOF(HeadTemp)) DO
                BEGIN
                 Read(HeadTemp,Head);
                 IF (Head.Numbers=LastDir) AND (Head.Attrib[5]) THEN
                  BEGIN
                   ChDir('..');
                   LastDir:=Head.DirNum;
                   Counter:=Counter+1;
                  END;
                END;
              UNTIL LastDir=Main.DirNum;
              IF NOT(DirExist(Main.Str)) THEN MkDir(Main.Str);
              ChDir(Main.Str);
              CurrentDir:=Main.Numbers;
              Counter:=Counter+1;
              WriteLn('Ok');
             END;
         END
         ELSE
          BEGIN
           MakeFile;
           TempSize:=Main.Offsets;
         END;
       END;
     END;

    PROCEDURE GetParams;

    VAR Counter:Integer;

     BEGIN
      ProcDir:=FALSE;
      IF ParamCount=0 THEN
       BEGIN
        WriteLn('Usage:');
        WriteLn('XTRACT [ -d | -D ] [DirectoryName] InFile OutFiles');
        WriteLn;
        WriteLn('-d or -D     : Gather files and directory structure');
        WriteLn('DirectoryName: Starting directory');
        WriteLn('InFile       : File to restore from');
        WriteLn('OutFiles     : Files to restore');
        WriteLn;
        WriteLn('Examples:');
        WriteLn('XTRACT PASFILES.GTH *.PAS    Gather all .PAS-files into the
    file PASFILES.GTH');
        WriteLn('XTRACT -D c:\dos DOSDIR.GTH *.*  GATHER all files in c:\dos
    and all directories');
        WriteLn('                                 and all files in them into
    the file DOSDIR.GTH');
        Halt(1);
       END
       ELSE
        BEGIN
         Counter:=1;
         IF (ParamStr(Counter)='-d') OR (ParamStr(Counter)='-D') THEN
          BEGIN
           ProcDir:=TRUE;
           Counter:=Counter+1;
          END;
         IF (ParamCount-Counter)=2 THEN
          BEGIN
           XtractDir:=ParamStr(Counter);
           Counter:=Counter+1;
          END
          ELSE
           XtractDir:=StartDir;
         XtractFrom:=ParamStr(Counter);
         XtractFiles:=ParamStr(Counter+1);
        END;
     END;

    BEGIN
     CLRSCR;
     WriteLn('Xtract version '+VersionNumber+' (C) '+CYear+' Centennial
    Innovations by Bruno Olsen');
     WriteLn;
     GetDir(0,StartDir); { 0 = Current drive }
     EnvTemp:=GetEnv('TEMP');
     EnvTemp:=EnvTemp+'\';
     DirCount:=0;FileCount:=0;SizeCount:=0;
     GetParams;
     Write('Analizing... ');
     CountFiles(DirCount,FileCount,SizeCount);
     Str(DirCount,ConvStr);
     Write('Directories: '+ConvStr);
     Str(FileCount,ConvStr);
     Write(' Files: '+ConvStr);
     Str(SizeCount,ConvStr);
     WriteLn(' Bytes: '+ConvStr);
     WriteLn;
     WriteLn('Processing...');
     ResetAttrib;
     Assign(MainFile,EnvTemp+'head.tmp');
     Assign(InFiles,StartDir+'\'+XtractFrom);
     Reset(MainFile);
     Read(MainFile,Main);
     Reset(InFiles,1);
     Seek(Infiles,TempSize);
     CurrentDir:=0;LastDir:=0;
     IF NOT(DirExist(XtractDir)) THEN MkDir(XtractDir);
     ChDir(XtractDir);
     ReadHeader(LastDir,CurrentDir);
     ChDir(StartDir);
     Close(MainFile);
     Close(InFiles);
     WriteLn;
     WriteLn('Cleaning up...');
     Assign(InFiles,EnvTemp+'head.tmp');
     Erase(InFiles);
     ChDir(StartDir);
     WriteLn('Done.');
    END.
    ---------------------------------------------------------

    Hope you find it a good idea :))

    ---------------------------------------------------------
    Regards,
             Bruno Olsen
             bo@vestnet.dk
             HTTP://home.vest.net/bo
    ---------------------------------------------------------

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