⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 zipviewu.pas

📁 ZIP文件查看器
💻 PAS
字号:
UNIT zipviewu;

(*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\/\/\/\/\/\/\/\*)
(* Unit : Zip View                    Date : March 23, 1994                  *)
(* By   : John Shipley                Ver  : 1.0                             *)
(*                                                                           *)
(* Credits : Steve Wierenga - ZIPV.PAS found in SWAG - Got me started on the *)
(*           zipviewu code since ZIPV.PAS was fairly easy to read unlike     *)
(*           some other code I had seen.                                     *)
(*                                                                           *)
(*           Tom Guinther - ZIPPER.PAS found in ZIPPER.ZIP (1989) available  *)
(*           on my BBS "The Brook Forest Inn 714-951-5282" This code helped  *)
(*           clarify many things. The zipper code is probably better than    *)
(*           this code and well documented.                                  *)
(*                                                                           *)
(*           PkWare's APPNOTE.TXT found in PKZ110.EXE                        *)
(*                                                                           *)
(* This unit is offered to the Public Domain so long as credit is given      *)
(* where credit is due. I accept NO liablity for what this code does to your *)
(* system or your friends or anyone elses. You have the code, so you can fix *)
(* it. If this code formats your hard drive and you loose your lifes work,   *)
(* then all I can say is "Why didn't you back it up?"                        *)
(*                                                                           *)
(* Purpose: To mimic "PKUNZIP -v " output. (v2.04g)                *)
(*          The code is pretty close to the purpose, but not perfect.        *)
(*                                                                           *)
(* Demo :                                                                    *)
(*                                                                           *)
(* PROGRAM zip_viewit;                                                       *)
(* USES DOS,CRT,zipviewu;                                                    *)
(* BEGIN                                                                     *)
(*   IF PARAMCOUNT<>0 THEN                                                   *)
(*     BEGIN                                                                 *)
(*       zipview(PARAMSTR(1));                                               *)
(*     END;                                                                  *)
(* END.                                                                      *)
(*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\\/\/\/\/\/\/\/\*)

INTERFACE

USES DOS,CRT;

PROCEDURE zipview(zipfile: STRING);

IMPLEMENTATION

CONST hexdigit : ARRAY[0..15] OF CHAR = '0123456789abcdef';

FUNCTION hexbyte(b: byte): STRING;                        (* Byte to Hexbyte *)
  BEGIN
    hexbyte := hexdigit[b SHR 4]+hexdigit[b AND $f];
  END;

FUNCTION hexlong(l: LONGINT): STRING;                  (* Longint to Hexlong *)
  VAR n : ARRAY[1..4] OF BYTE ABSOLUTE l;
  BEGIN
    hexlong := hexbyte(n[4])+hexbyte(n[3])+hexbyte(n[2])+hexbyte(n[1]);
  END;

FUNCTION lenn(s: STRING): INTEGER;     (* Like LENGTH, but skips color codes *)
  VAR i,len : INTEGER;
  BEGIN
    len := LENGTH(s);
    i := 1;
    WHILE (i<=LENGTH(s)) DO
      BEGIN
        IF (s[i] IN [#3,'^']) THEN
          IF (i0 THEN EXIT;               (* If error then exit function *)
      IF (buf.signature=csig) THEN (* Did we find the first central header? *)
        BEGIN
          seekc := TRUE;                      (* Found first central header *)
          SEEK(f,curpos); (* Ensure we are at central headers file position *)
        END;
  END;

  VAR curpos : LONGINT;

  BEGIN
    numfiles := 0;      (* Counter of Number of Files to Determine When Done *)
    z        := 0;                   (* Counter of Number of Files Processed *)
    totalu   := 0;                      (* Total Bytes of Uncompressed Files *)
    totalc   := 0;                      (* Total Size after being Compressed *)
    NEW(hdr);        (* Dynamically Allocate Memory for a Temp Header Record *)
    ASSIGN(f,zipfile);                        (* Assign Filename to File Var *)
    {$I-}
    RESET(f,1);                                         (* Open Untyped File *)
    {$I+}
    IF IORESULT<>0 THEN                  (* If we get an error, exit program *)
      BEGIN
        WRITELN('Error - File not found.');
        HALT(253);
      END;
    IF NOT seekc(f) THEN (* Skip Local Headers and goto first Central Header *)
      BEGIN                       (* If we could not locate a Central Header *)
        CLOSE(f);                                      (* Close Untyped File *)
        WRITELN('Error - Corrupted or Not a ZIP File.');
        HALT(254);                                           (* Exit Program *)
      END;

    WRITELN(' Length  Method   Size  Ratio   Date    Time    CRC-32 '+
      ' Attr  Name');
    WRITELN(' ------  ------   ----- -----   ----    ----   --------'+
      ' ----  ----');
    REPEAT
      FILLCHAR(s,SIZEOF(s),#0);                         (* Clear Name String *)
      BLOCKREAD(f,hdr^,SIZEOF(cheader));                 (* Read File Header *)
      BLOCKREAD(f,MEM[SEG(s):OFS(s)+1],hdr^.fnamelen);  (* Read Archive Name *)
      s[0] := CHR(hdr^.fnamelen);                 (* Get Archive Name Length *)
      IF (hdr^.signature=csig) THEN                           (* Is a header *)
        BEGIN
          INC(z);                                  (* Increment File Counter *)
          WRITE(mrn(cstr(hdr^.usize),7));       (* Display Uncompressed Size *)
          WRITE(' '+mrn(comptypes[hdr^.compress],7));  (* Compression Method *)
          WRITE(mrn(cstr(hdr^.csize),8));         (* Display Compressed Size *)
          percent := ROUND(100.0-(hdr^.csize/hdr^.usize*100.0));
          WRITE(mrn(cstr(percent),4)+'% ');   (* Display Compression Percent *)
          WRITE(' '+w2date(hdr^.date)+' ');    (* Display Date Last Modified *)
          WRITE(' '+w2time(hdr^.time)+' ');    (* Display Time Last Modified *)
          WRITE(' '+hexlong(hdr^.crc32)+' ');       (* Display CRC-32 in Hex *)
          WRITE(b2attr(hdr^.efa[1],hdr^.gpflag[1]));   (* Display Attributes *)
          WRITELN(' '+mln(s,13));                (* Display Archive Filename *)
          INC(totalu,hdr^.usize);             (* Increment size uncompressed *)
          INC(totalc,hdr^.csize);               (* Increment size compressed *)
        END;
      SEEK(f,FILEPOS(f)+hdr^.extrafield+hdr^.fcl);
    UNTIL (hdr^.signature<>csig) OR EOF(f) OR (z=numfiles); (* No more Files *)
    WRITELN(' ------          ------  ---                                 '+
      ' -------');
    WRITE(mrn(cstr(totalu),7)+'         ');    (* Display Total Uncompressed *)
    WRITE(mrn(cstr(totalc),7)+' ');              (* Display Total Compressed *)
    WRITE((100-TotalC/TotalU*100):3:0,'%'+mrn(' ',34));   (* Display Percent *)
    WRITELN(mrn(cstr(z),7));                      (* Display Number of Files *)
    CLOSE(f);                                          (* Close Untyped File *)
    DISPOSE(hdr);                            (* Deallocate Header Var Memory *)
  END;

END.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -