{ Author: Steve Wierenga ZIP Viewer } Unit ZipV; (**) Interface (**) Uses Dos,Crt; Procedure ZipView(ZIPFile:String); Function GAN(ZIPFile : String) : String; (**) Implementation (**) Procedure Terminate; begin Write('ARCHPEEK could not find specified File. Aborting...'); Halt; end; Procedure ZipView(ZIPFile : String); { View the ZIP File } Const SIG = $04034B50; { Signature } Type ZFHeader = Record { Zip File Header } Signature : LongInt; Version, GPBFlag, Compress, Date,Time : Word; CRC32, CSize, USize : LongInt; FNameLen, ExtraField : Word; end; Var z : Integer; x, totalu, totalc : LongInt; Hdr : ^ZFHeader; F : File; S,sss : String; own : Text; dt1 : DateTime; l : String[80]; registered : Boolean; { Is registered? } Const CompTypes : Array[0..7] of String[9] = ('Stored ','Shrunk ','Reduced1','Reduced2','Reduced3', 'Reduced4','Imploded ','Deflated'); { Method used to compress } r = #196; q = #205; begin z := 0; totalu := 0; totalc := 0; { Init Variables } registered := False; { Unregistered } if not registered then { Is registered? } begin Writeln('ArchPeek 0.01Alpha [UNREGISTERED] Copyright 1993 Steve Wierenga'); Delay(200); end; New(Hdr); Assign(F,ZIPFile); {$I-} Reset(F,1); { Open File } {$I+} If IOResult <> 0 then Terminate; { Couldn't open Zip File } sss := GAN(ZipFile); { Get the Zip Filename } Writeln('Zip FileName: ',sss); WriteLn( ' Name Length Size Saved Method'); WriteLn(r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r, r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r,r); Repeat FillChar(S,SizeOf(S), #0); { Pad With nulls } BlockRead(F,Hdr^,SizeOf(ZFHeader)); { Read File Header } BlockRead(F,Mem[Seg(S) : Ofs(S) + 1], Hdr^.FNameLen); s[0] := Chr(Hdr^.FNameLen); Case Length(S) Of { Straighten String } 0 : s := s + ' '; 1 : S := s + ' '; 2 : s := s + ' '; 3 : S := S + ' '; 4 : S := S + ' '; 5 : S := S + ' '; 6 : S := S + ' '; 7 : S := S + ' '; 8 : S := S + ' '; 9 : S := S + ' '; 10 : S := S + ' '; 11 : S := S + ' '; 12 : S := S; end; If (Hdr^.Signature = Sig) Then { Is a header } begin z := z + 1; WriteLn(S,Hdr^.USize:9,Hdr^.CSize:10,(100-Hdr^.CSize/Hdr^.USize*100):5:0,'%', CompTypes[Hdr^.Compress]:16); Inc(TotalU,Hdr^.USize); { Increment size uncompressed } Inc(TotalC,Hdr^.CSize); { Increment size compressed } end; Seek(F,FilePos(F) + Hdr^.CSize + Hdr^.ExtraField); Until Hdr^.Signature <> SIG; { No more Files } GetFTime(F,x); UnPackTime(x,DT1); WriteLn(q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q, q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q,q); Write( z:4,' Files ',TotalU:12,TotalC:10,(100-TotalC/TotalU*100):5:0,'%'); Case dt1.month of { Get Zip File date and time } 1..9 : Write( '0':4,dt1.month); 10..12 : Write( dt1.month:4); end; Write( '/'); Case dt1.day of 1..9 : Write( '0',dt1.day); 10..31 : Write( dt1.day); end; Write( '/'); Case dt1.year of 1980 : Write( '80'); 1981 : Write( '81'); 1982 : Write( '82'); 1983 : Write( '83'); 1984 : Write( '84'); 1985 : Write( '85'); 1986 : Write( '86'); 1987 : Write( '87'); 1988 : Write( '88'); 1989 : Write( '89'); 1990 : Write( '90'); 1991 : Write( '91'); 1992 : Write( '92'); 1993 : Write( '93'); 1994 : Write( '94'); 1995 : Write( '95'); 1996 : Write( '96'); end; Case dt1.hour of 0..9 : Write( '0':3,dt1.hour,':'); 10..23 : Write( dt1.hour:3,':'); end; Case dt1.min of 0..9 : Write( '0',dt1.min,':'); 10..59 : Write( dt1.min,':'); end; Case dt1.sec of 0..9 : Writeln( '0',dt1.sec); 10..59 : Writeln( dt1.sec); end; Close(F); Dispose(Hdr); end; Function GAN(ZIPFile:String): String; Var Dir : DirStr; Name : NameStr; Exts : ExtStr; begin FSplit(ZIPFile,Dir,Name,Exts); GAN := Name + Exts; end; end.