Entwickler-Ecke

Dateizugriff - GZipped Datei als Stream auslesen


Tilman - Mi 01.12.10 16:59
Titel: GZipped Datei als Stream auslesen
Hi, ich hab Dateien die mit GZip komprimiert sind, und möchte diese als Stream auslesen (zwischenspeichern würde notfalls aber auch gehen, als Stream wärs mir aber lieber). Ich hab bisher versucht mit Abbrevia AbUnzipper zu arbeiten, aber irgendwie klappt das nicht, ich bekomme stets "Unhandled Archive Type". Wenn ich force Type und atGZip benutze, dann gibts zwar keine Fehlermeldung, aber der enthaltene Dateiname wird als "Unknown" zurückgegeben, und der Stream hat eine länge von 0.

Die Dateien haben die Dateiendung .dat

Hat jemand eine Funktionierende Lösung für GZip dekomprimierung, oder ein funktionierendes Beispiel für Abbrevia?

P.S. habe Turbo Delphi.

Schonmal danke fürs lesen ;)


jaenicke - Mi 01.12.10 18:22

Bei Indy muss das dabei sein, denn Indy unterstützt diese Komprimierung bei der Datenübertragung.

TIdCompressorZLibEx oder so ähnlich gibt es. Genauer weiß ich es im Moment nicht, da müsste ich selbst nachschauen.


Tilman - Mi 01.12.10 18:34

Also die Komponente gibts schonmal, werde sie mir anschauen, danke! :zustimm:


Tilman - Do 02.12.10 18:40

Es scheint zu funzen :) Vielen Dank nochmal! Hier ein kleines Stück Beispielcode für zukünftige Tester, wichtig ist dass der Ausgabestream mit Seek zurückgestezt werden muss, sonst bekommt man nur 0en zurück ^^ hatte daran gestern etwas geknabbert, aber gerade eben kam mir der Gedanke, und es hat geklappt =)

idcom = tIDCompressorZLibEx


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
  var
    pfad: string;
    datei: tFileStream;
    ausgabe: tMemoryStream;
    buffer: Byte;
    n: Integer;

begin
  pfad := 'c:\irgendwas';
  datei := TFileStream.Create(pfad,fmOpenRead);
  ausgabe := tMemoryStream.Create;
  idcomp.DecompressDeflateStream(datei,ausgabe);
  ausgabe.Seek(0,soFromBeginning);
  writeln(ausgabe.Size);
  for n := 0 to 500 do
    begin
      ausgabe.Read(buffer,1);
      write(buffer);
      write(',');
    end;

  ausgabe.Free;
  datei.Free;
end;