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

    {
     > I'm looking For descriptions of the formats of headers in
     > all popular archive Files, ie .ZIP, .ARC, .LZH, .ARJ, etc.
     > I just want to be able to read the headers of all of these
     > archives, not necessarily manipulate them.  Anyone know
     > where such can be had?

    Here's a Program that will determine most of the major archive Types.
    I've made a couple of additions, but the original source was from
    a message on this echo...the original author's name has since been
    lost.  To use the Procedure, just call it as follows:
     If GetArcType(FileName.Ext)=Zip then....
    }

    Uses
      Dos;

    Type
      ArcType = (FileError, Unknown, Zip, Zoo, Arc, Lzh, Pak, Arj);

    Function GetArcType(FName : String) : ArcType;
    Var
      ArcFile : File of Byte;
      i       : Integer;
      Gat     : ArcType;
      c       : Array[1..5] of Byte;
    begin
      Assign(ArcFile, FName);
      {$I-}
      Reset(ArcFile);
      {$I+}
      if IOResult <> 0 then
        Gat := FileError
      else
      if FileSize(ArcFile) < 5 then
        Gat := FileError
      else
      begin
        For i := 1 to 5 do
          Read(ArcFile, c[i]);
        Close(ArcFile);
        if ((c[1] = $50) and (c[2] = $4B)) then
          Gat := Zip
        else
        if ((c[1] = $60) and (c[2] = $EA)) then
          Gat := Arj
        else
        if ((c[4] = $6c) and (c[5] = $68)) then
          Gat := Lzh
        else
        if ((c[1] = $5a) and (c[2] = $4f) and (c[3] = $4f)) then
          Gat := Zoo
        else
        if ((c[1] = $1a) and (c[2] = $08)) then
          Gat := Arc
        else
        if ((c[1] = $1a) and (c[2] = $0b)) then
          Gat := Pak
        else
          Gat := Unknown;
      end;

      GetArcType := Gat;
    end;

    Var
      FileName : String;
      Return   : ArcType;
      {ArcType = (FileError,Unknown,Zip,Zoo,Arc,Lzh,Pak,Arj)}

    begin
     if ParamCount = 1 then
     begin
       FileName := ParamStr(1);
       Return   := GetArcType(FileName);
       Case Return of
         ARJ     : Writeln(FileName, ' = ARJ ');
         PAK     : Writeln(FileName, ' = PAK ');
         LZH     : Writeln(FileName, ' = LZH ');
         ARC     : Writeln(FileName, ' = ARC ');
         ZOO     : Writeln(FileName, ' = ZOO ');
         ZIP     : Writeln(FileName, ' = ZIP ');
         UNKNOWN : Writeln(FileName, ' = Unknown!')
         else
           Writeln('File Not Found');
       end;
     end {IF}
     else
      Writeln('No parameter');
    end.

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