Den Inhalt einer ZIP-Datei anzeigen
Autor: JOHN SHIPLEY
{------8<-------------Snip---------------8<------------Snip------------8<-------}
{$I-}
UNIT Zipviewu;
(*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\/\/\/\/\/\/\/\*)
(* Einheit: Zip Datum anzeigen: 23. März 1994 *)
(* Von: John Shipley Ver: 1.0 *)
(* *)
(* Kredite: Steve Wierenga - ZIPV. PAS gefunden in SWAG - Got me started auf die *)
(* Zipviewu-Code seit ZIPV. PAS war ziemlich einfach, im Gegensatz zu lesen *)
(* einige Codes, die ich gesehen hatte. *)
(* *)
(* Tom Guinther - Reißverschluss. PAS in Reißverschluss gefunden. ZIP (1989) verfügbar *)
(* auf meine BBS 'Die Brook Forest Inn 714-951-5282' dazu beigetragen, diesen Code *)
(* viele Dinge zu klären. Der Reißverschluss-Code ist wahrscheinlich besser als *)
(* diesen Code und gut dokumentiert. *)
(* *)
(* Die PkWare APPNOTE. TXT im PKZ110 gefunden. EXE *)
(* *)
(* Diese Einheit wird für den öffentlichen Bereich angeboten, so lange die Gutschrift gegeben ist *)
(* wem Ehre gebührt. Ich akzeptiere keine Haftung für welches dieser Code tut Ihr *)
(* System oder deine Freunde oder jemand Elses. Sie haben den Code, damit Sie beheben können *)
(* es. Wenn dieser Code Ihre Festplatte formatiert und Sie Ihre Arbeit Stillleben verlieren *)
(* dann alles, die ich sagen kann, ist 'Warum nicht Sie sichern sie?' *)
(* *)
(* Zweck: um 'PKUNZIP - V' Ausgabe zu imitieren. (v2.04g) *)
(* Der Code ist sehr nahe dem Zweck, aber nicht perfekt. *)
(* *)
(* Demo: *)
(* *)
(* Programm Zip_viewit; *)
(* Verwendet DOS, CRT, Zipviewu; *)
(* BEGINNEN *)
(* IF PARAMCOUNT <> 0 dann *)
(* BEGINNEN *)
(* zipview(PARAMSTR(1)); *)
(* ENDE; *)
(* ENDE. *)
(*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\/\/\/\/\/\/\/\*)
SCHNITTSTELLE
VERWENDET DOS, CRT;
Prozedur Zipview(zipfile: STRING);
UMSETZUNG
CONST Hexdigit: ARRAY [0..15] von CHAR = '0123456789abcdef';
Funktion Hexbyte (b: Byte): STRING; (* Zu Hexbyte Byte *)
BEGIN
Hexbyte: = Hexdigit [SHR-4 b] + Hexdigit [b AND $f];
ENDE;
Funktion Hexlong (l: LONGINT): STRING; (* Longint, Hexlong *)
VAR n: ARRAY [1..4] von BYTE ABSOLUTE l;
BEGIN
Hexlong: = hexbyte(n[4])+hexbyte(n[3])+hexbyte(n[2])+hexbyte(n[1]);
ENDE;
Funktion Lenn (s: STRING): INTEGER; (* Wie Länge, sondern überspringt-Codes Farb *)
VAR i, Len: INTEGER;
BEGIN
Len: = LENGTH(s);
Ich: = 1;
WÄHREND (ich < =LENGTH(s))
BEGIN
IF (s [i] IN [#3,'^ ']) dann
IF (i0 THEN EXIT; (* Wenn Fehler Funktion beenden *)
IF (buf.signature=csig) (* haben wir den ersten zentralen Header gefunden? *)
BEGIN
Seekc: = TRUE; (* Ersten zentralen Header gefunden *)
Seek(f,curpos); (* Sicherzustellen, sind wir an zentralen Header Dateiposition *)
ENDE;
ENDE;
VAR Curpos: LONGINT;
BEGIN
Numfiles: = 0; (* Zähler für die Anzahl der Dateien, um festzustellen, wann getan *)
Z: = 0; (* Zähler Anzahl Dateien verarbeitet *)
Totalu: = 0; (* Bytes von unkomprimierten Dateien insgesamt *)
Totalc: = 0; (* Gesamtgröße nach komprimiert *)
New(HDR); (* Dynamisch reservieren von Speicher für eine temporäre Steuersatz *)
Assign(f,zipfile); (* Dateiname Datei Var zuweisen *)
{$I-}
Reset(f,1); (* Nicht typisierte Datei öffnen *)
{$I+}
IF IORESULT <> 0 dann (* wenn wir eine Fehlermeldung erhalten, beenden Programm *)
BEGIN
WRITELN ('Fehler - Datei nicht gefunden.');
HALT(253);
ENDE;
Wenn nicht dann seekc(f) (* Skip lokale Kopf- und Goto ersten zentralen Header *)
BEGINNEN (* wenn wir keinen zentralen Header finden konnte *)
Close(f); (* Nicht typisiert schließen Datei *)
WRITELN ('Fehler - beschädigt oder keine ZIP-Datei.');
HALT(254); (* Beenden *)
ENDE;
WRITELN (' Länge Methode Größe Verhältnis Datum Zeit CRC-32 ' +
'Attr Name');
WRITELN(' ------ ------ ----- ----- ---- ---- --------'+
' ---- ----');
WIEDERHOLEN SIE DIE
FILLCHAR(s,sizeof(s),#0); (* Namestring zu löschen *)
BLOCKREAD(f,HDR^,sizeof(cheader)); (* Dateiheader lesen *)
BLOCKREAD(f,mem[SEG(s):OFS(s)+1],HDR^.fnamelen); (* Archivnamen lesen *)
s [0]: = CHR(hdr^.fnamelen); (* Archiv Namenslänge erhalten *)
IF (Hdr ^ .signature = Csig) dann (* ist ein Header *)
BEGIN
Inc(z); (* Datei Zähler Inkrementieren *)
Write(MRN(CStr(HDR^.usize),7)); (* Unkomprimierte Größe angezeigt *)
Schreiben ('' + mrn(comptypes[hdr^.compress],7)) aus; (* Komprimierungsmethode *)
Write(MRN(CStr(HDR^.CSize),8)); (* Komprimierte Displaygröße *)
Prozent: = ROUND(100.0-(hdr^.csize/hdr^.usize*100.0));
Write(MRN(CStr(Percent),4)+ '%'); (* Anzeige der Kompression Prozent *)
WRITE ('' + w2date(hdr^.date) +' '); (* Letzte Änderungsdatum angezeigt *)
WRITE ('' + w2time(hdr^.time) +' '); (* Anzeige der Uhrzeit der letzten Änderung *)
WRITE ('' + hexlong(hdr^.crc32) +' '); (* CRC-32 in Hex angezeigt *)
Write(b2attr(HDR^.EFA[1],HDR^.gpflag[1])); (* Zeigt Attribute *)
WRITELN (' '+ mln(s,13)); (* Anzeige Archiv Dateiname *)
Inc(totalu,HDR^.usize); (* Größe unkomprimiert zu erhöhen *)
Inc(totalc,HDR^.CSize); (* Erhöhen Größe komprimiert *)
ENDE;
Seek(f,filepos(f)+HDR^.ExtraField+HDR^.FCL);
BIS (Hdr ^ .signature <> Csig) EOF(f) oder (Z = Numfiles); (* Keine weiteren Dateien *)
WRITELN ('---------' +
' -------');
Write(MRN(CStr(totalu),7)+' '); (* Anzeige Total unkomprimiert *)
Write(MRN(CStr(totalc),7)+' '); (* Anzeige Total komprimiert *)
Schreiben ((100-TotalC/TotalU * 100):3:0, '%' + Mrn (' ', 34)); (* Anzeige Prozent *)
WRITELN(MRN(CStr(z),7)); (* Anzahl der Dateien angezeigt *)
Close(f); (* Nicht typisiert schließen Datei *)
DISPOSE(HDR); (* Header Var Speicher freigeben *)
ENDE;
ENDE.
ZIP-viewer
ZIP-viewer : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Den Inhalt einer ZIP-Datei anzeigen
Autor: JOHN SHIPLEY
{------8<-------------Snip---------------8<------------Snip------------8<-------}
{$I-}
UNIT Zipviewu;
(*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\/\/\/\/\/\/\/\*)
(* Einheit: Zip Datum anzeigen: 23. März 1994 *)
(* Von: John Shipley Ver: 1.0 *)
(* *)
(* Kredite: Steve Wierenga - ZIPV. PAS gefunden in SWAG - Got me started auf die *)
(* Zipviewu-Code seit ZIPV. PAS war ziemlich einfach, im Gegensatz zu lesen *)
(* einige Codes, die ich gesehen hatte. *)
(* *)
(* Tom Guinther - Reißverschluss. PAS in Reißverschluss gefunden. ZIP (1989) verfügbar *)
(* auf meine BBS 'Die Brook Forest Inn 714-951-5282' dazu beigetragen, diesen Code *)
(* viele Dinge zu klären. Der Reißverschluss-Code ist wahrscheinlich besser als *)
(* diesen Code und gut dokumentiert. *)
(* *)
(* Die PkWare APPNOTE. TXT im PKZ110 gefunden. EXE *)
(* *)
(* Diese Einheit wird für den öffentlichen Bereich angeboten, so lange die Gutschrift gegeben ist *)
(* wem Ehre gebührt. Ich akzeptiere keine Haftung für welches dieser Code tut Ihr *)
(* System oder deine Freunde oder jemand Elses. Sie haben den Code, damit Sie beheben können *)
(* es. Wenn dieser Code Ihre Festplatte formatiert und Sie Ihre Arbeit Stillleben verlieren *)
(* dann alles, die ich sagen kann, ist 'Warum nicht Sie sichern sie?' *)
(* *)
(* Zweck: um 'PKUNZIP - V' Ausgabe zu imitieren. (v2.04g) *)
(* Der Code ist sehr nahe dem Zweck, aber nicht perfekt. *)
(* *)
(* Demo: *)
(* *)
(* Programm Zip_viewit; *)
(* Verwendet DOS, CRT, Zipviewu; *)
(* BEGINNEN *)
(* IF PARAMCOUNT <> 0 dann *)
(* BEGINNEN *)
(* zipview(PARAMSTR(1)); *)
(* ENDE; *)
(* ENDE. *)
(*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\/\/\/\/\/\/\/\*)
SCHNITTSTELLE
VERWENDET DOS, CRT;
Prozedur Zipview(zipfile: STRING);
UMSETZUNG
CONST Hexdigit: ARRAY [0..15] von CHAR = '0123456789abcdef';
Funktion Hexbyte (b: Byte): STRING; (* Zu Hexbyte Byte *)
BEGIN
Hexbyte: = Hexdigit [SHR-4 b] + Hexdigit [b AND $f];
ENDE;
Funktion Hexlong (l: LONGINT): STRING; (* Longint, Hexlong *)
VAR n: ARRAY [1..4] von BYTE ABSOLUTE l;
BEGIN
Hexlong: = hexbyte(n[4])+hexbyte(n[3])+hexbyte(n[2])+hexbyte(n[1]);
ENDE;
Funktion Lenn (s: STRING): INTEGER; (* Wie Länge, sondern überspringt-Codes Farb *)
VAR i, Len: INTEGER;
BEGIN
Len: = LENGTH(s);
Ich: = 1;
WÄHREND (ich < =LENGTH(s))
BEGIN
IF (s [i] IN [#3,'^ ']) dann
IF (i0 THEN EXIT; (* Wenn Fehler Funktion beenden *)
IF (buf.signature=csig) (* haben wir den ersten zentralen Header gefunden? *)
BEGIN
Seekc: = TRUE; (* Ersten zentralen Header gefunden *)
Seek(f,curpos); (* Sicherzustellen, sind wir an zentralen Header Dateiposition *)
ENDE;
ENDE;
VAR Curpos: LONGINT;
BEGIN
Numfiles: = 0; (* Zähler für die Anzahl der Dateien, um festzustellen, wann getan *)
Z: = 0; (* Zähler Anzahl Dateien verarbeitet *)
Totalu: = 0; (* Bytes von unkomprimierten Dateien insgesamt *)
Totalc: = 0; (* Gesamtgröße nach komprimiert *)
New(HDR); (* Dynamisch reservieren von Speicher für eine temporäre Steuersatz *)
Assign(f,zipfile); (* Dateiname Datei Var zuweisen *)
{$I-}
Reset(f,1); (* Nicht typisierte Datei öffnen *)
{$I+}
IF IORESULT <> 0 dann (* wenn wir eine Fehlermeldung erhalten, beenden Programm *)
BEGIN
WRITELN ('Fehler - Datei nicht gefunden.');
HALT(253);
ENDE;
Wenn nicht dann seekc(f) (* Skip lokale Kopf- und Goto ersten zentralen Header *)
BEGINNEN (* wenn wir keinen zentralen Header finden konnte *)
Close(f); (* Nicht typisiert schließen Datei *)
WRITELN ('Fehler - beschädigt oder keine ZIP-Datei.');
HALT(254); (* Beenden *)
ENDE;
WRITELN (' Länge Methode Größe Verhältnis Datum Zeit CRC-32 ' +
'Attr Name');
WRITELN(' ------ ------ ----- ----- ---- ---- --------'+
' ---- ----');
WIEDERHOLEN SIE DIE
FILLCHAR(s,sizeof(s),#0); (* Namestring zu löschen *)
BLOCKREAD(f,HDR^,sizeof(cheader)); (* Dateiheader lesen *)
BLOCKREAD(f,mem[SEG(s):OFS(s)+1],HDR^.fnamelen); (* Archivnamen lesen *)
s [0]: = CHR(hdr^.fnamelen); (* Archiv Namenslänge erhalten *)
IF (Hdr ^ .signature = Csig) dann (* ist ein Header *)
BEGIN
Inc(z); (* Datei Zähler Inkrementieren *)
Write(MRN(CStr(HDR^.usize),7)); (* Unkomprimierte Größe angezeigt *)
Schreiben ('' + mrn(comptypes[hdr^.compress],7)) aus; (* Komprimierungsmethode *)
Write(MRN(CStr(HDR^.CSize),8)); (* Komprimierte Displaygröße *)
Prozent: = ROUND(100.0-(hdr^.csize/hdr^.usize*100.0));
Write(MRN(CStr(Percent),4)+ '%'); (* Anzeige der Kompression Prozent *)
WRITE ('' + w2date(hdr^.date) +' '); (* Letzte Änderungsdatum angezeigt *)
WRITE ('' + w2time(hdr^.time) +' '); (* Anzeige der Uhrzeit der letzten Änderung *)
WRITE ('' + hexlong(hdr^.crc32) +' '); (* CRC-32 in Hex angezeigt *)
Write(b2attr(HDR^.EFA[1],HDR^.gpflag[1])); (* Zeigt Attribute *)
WRITELN (' '+ mln(s,13)); (* Anzeige Archiv Dateiname *)
Inc(totalu,HDR^.usize); (* Größe unkomprimiert zu erhöhen *)
Inc(totalc,HDR^.CSize); (* Erhöhen Größe komprimiert *)
ENDE;
Seek(f,filepos(f)+HDR^.ExtraField+HDR^.FCL);
BIS (Hdr ^ .signature <> Csig) EOF(f) oder (Z = Numfiles); (* Keine weiteren Dateien *)
WRITELN ('---------' +
' -------');
Write(MRN(CStr(totalu),7)+' '); (* Anzeige Total unkomprimiert *)
Write(MRN(CStr(totalc),7)+' '); (* Anzeige Total komprimiert *)
Schreiben ((100-TotalC/TotalU * 100):3:0, '%' + Mrn (' ', 34)); (* Anzeige Prozent *)
WRITELN(MRN(CStr(z),7)); (* Anzahl der Dateien angezeigt *)
Close(f); (* Nicht typisiert schließen Datei *)
DISPOSE(HDR); (* Header Var Speicher freigeben *)
ENDE;
ENDE.