Hvordan vise innholdet i en RAR fil
bidragsyter. GEORGE ROBERTS product: {La meg gjette, du prøver å liste ut filene i RAR arkivet, riktig? Her er hvordan jeg gjør det (dette er grovt, fordi jeg rense den fra min kilde fordi min håndterer det litt annerledes):}
CONST errmsg: array [0..5] av string [49] = (' Får ikke tilgang til filen ',' Uventet slutt på filen ',' Uventet lesefeil ',' Ugyldig header ID støtt ',' '' t finne neste post i arkivet ',' Filen er ikke i RAR arkiv format ');
metode: array [0..21] av string [9] = ('katalog', {* Directory markør *}! Unknown ', {* Ukjent komprimeringstype *} Lagret', {* Ingen kompresjon * } Pakket ', {* Gjenta-byte komprimering *} Presset', {* Huffman med repeat-byte komprimering *} knaste ', {* Foreldet LZW-komprimering *} knaste', {* LZW 9-12 bit med gjenta-byte komprimering *} Squashed ', {* LZW 9-13 bit komprimering *} Knust', {* LZW 2-13 bit komprimering *} krympet ', {* LZW 9-13 bit komprimering *} Redusert 1 ', {* Probabilistic faktor en kompresjon *} Redusert 2', {* Probabilistic faktor to kompresjons *} Redusert 3 ', {* Probabilistic faktor 3 kompresjon *} Redusert 4', {* Probabilistic faktor 4 komprimering *} "Frosset ', {* Modifisert LZW /Huffman-komprimering *} implodert', {* Shannon-Fano treet komprimering *} implodert ', {* Shannon-Fano treet komprimering *} Raskeste", "Fast", "Normal" «God komp", "Best Comp ');
TYPE outrec = rekord {* utgang informasjonsstruktur *} filnavn: string [255]; {* Utgang filnavn *} dato: integer; {* Utgangsdato *} tid: integer; {* Utgang tid *} typ: integer; {* Utgang lagringstype *} cSize: longint; {* Utgang komprimert størrelse *} usize: longint; {* Utgang ukomprimert størrelse *} end;
rarheaderrec = posten b: array [1..7] i byte; ende; rarfilerec = rekord Kromatredusert Teknisk data: longint; unpacksize: longint; HOSTOS: byte; {0 dos en os /2} FileCRC: longint; mod_time: integer; mod_date: integer; rarver: byte; metode: byte; fnamesize: integer; attr: longint; ende;
VAR ut: outrec; avbrutt: boolean;
prosedyre emsg (melding: string); begin {* emsg - Display feilmelding *}
writeln; writeln ('*' + melding); avbrutt: = true; ende;
funksjon getbyte (var fp: file): char; Var buf: array [0..0] av røye; numread: ord; c: char; begynne if (ikke avbrutt), og start blockread (fp, c, 1, numread); hvis numread = 0 da begynne nær (fp); emsg (errmsg [1]); ende; getbyte: = c; ende; end;
prosedyre Process_RAR (var fp: file);
Var rar: rarfilerec; rh: rarheaderrec; RHA: array [1..100] av byte; buf: array [0..25] av byte; h: integer; annonse: longint; numread: ord; Jeg, stat: integer; ADD2: ord; c: char; legge til: boolean;
begynne
stund (ikke avbrutt) trenger begin {* satt opp uendelig loop (exit er innen loop) *} legge til: = false; blockread (fp, rh.b [1], 5, numread); hvis numread < > 5 deretter emsg (errmsg [2]); if (avbrutt) og avslutter; hvis ikke (rh.b [3] = $ 74) og avslutter; blockread (fp, h, 2, numread); hvis numread < > 2 da emsg (errmsg [2]); if (avbrutt) og avslutter; blockread (fp, rar, sizeof (rar), numread); hvis numread < > sizeof (rar) så emsg (errmsg [2]); if (avbrutt) og avslutter; out.filename: = ''; for i: = 1 til rar.fnamesize gjøre {* få filnavn *} out.filename [i]: = getbyte (fp); out.filename [0]: = chr (rar.fnamesize); out.filename: = stripname (out.filename); out.date:=rar.mod_date; out.time: = rar.mod_time; out.csize: = rar.packsize; out.usize: = rar.unpacksize; Ved rar.method på $ 30: out.typ: = 2; {* Lagret *} $ 31: out.typ: = 17; {* Krympet *} $ 32: out.typ: = 18; $ 33: out.typ: = 19; $ 34: out.typ: = 20; $ 35: out.typ: = 21; ellers begynner out.typ: = 1; {* Unknown! *} End; enden, product: {sted kall til rutine som viser én fil liste linje ved hjelp av variable}
{$ I-} søke (fp, filepos (fp) + (h- (sizeof (rar) +7+ lengde ( out.filename)))); {$ I +} if (ioresult < > 0) deretter emsg (errmsg [4]); if (avbrutt) og avslutter; {$ I-} søker (FP, filepos (FP) + (rar.packsize)); {$ I +} if (ioresult < > 0) deretter emsg (errmsg [4]); if (avbrutt) og avslutter; ende; end;
prosedyre showrar (infile: string); Var RHA: array [1..15] av byte; c: char; h: ord; numread: ord;
begynne tildele (fp, infile); {$ I-} reset (fp, 1); {$ I +} hvis ioresult < > 0 da begynne ende;
c: = getbyte (fp); {* Bestemme type arkiv *} if (c = $ 52) da begynne if (ord (getbyte (fp)) < > $ 61) så emsg (errmsg [5]); if (ord (getbyte (fp)) < > $ 72) så emsg (errmsg [5]); if (ord (getbyte (fp)) < > $ 21) så emsg (errmsg [5]); if (ord (getbyte (fp)) < > $ 1a) så emsg (errmsg [5]); c: = getbyte (fp); c: = getbyte (fp); blockread (fp, RHA [1], 5, numread); hvis numread < > 5 deretter abend (abort, neste, errmsg [2]); hvis RHA [3] < > $ 73 deretter begynne emsg (errmsg [2]); ende; blockread (fp, h, 2, numread); hvis numread < > 2 da emsg (errmsg [2]); blockread (fp, RHA [1], 6, numread); hvis numread < > 6 så emsg (errmsg [2]); {$ I-} søker (FP, filepos (FP) + (h-13)); {$ I +} if (ioresult < > 0) deretter emsg (errmsg [4]); writeln ('Original Compress% Met' + 'hod Dato Tid Filnavn'); writeln ('-------- -------- --- "+" --------- -------- ------ - ---------- '); process_RAR (fp); {* Prosessen RAR oppføring *} product: {sted kall til rutine som viser eventuelle summer eller noe du kan ha kompilert}
ende annet reset (fp, 1);
tett (fp); {* Nær fil *}
slutten;
Dette er ikke en komplett enhet eller program fordi det er et klipp og lim fra (mange) ulike kildefilene mine ...;) Jeg vise en haug med forskjellige arkiv typer og visnings rutiner er alle sammenvevd, så jeg måtte kutte ut RAR de å vise deg her. Jeg vil ikke foreslå å lese filen byte av byte og prøver å konvertere den. Jeg ville bare gjøre noe som det jeg har gjort her, (jeg mente at dette skal være et eksempel ... ikke nødvendigvis en klipp og lim-løsning) og bruke posten og blockread i posten.
Håper dette hjelper litt!;)
George A. Roberts IV Intuitive Vision Software [email protected] Anmeldelser
Innholdet i RAR file
Previous:Readstring bekker linje ved line
Next Page:Hvilken type er det