![]() |
Decompress einer gz-Datei mit NULL-Zeichen
Hi,
bisher decompresse ich gz-Dateien mit folgendem Code:
Delphi-Quellcode:
Jetzt funktioniert dies leider nicht mit gz-Dateien, wo ein NULL-Zeichen enthalten ist. Dort enthält das Result dann nur den File-Inhalt bis zum NULL-Zeichen.
uses System.Zlib;
class function TStringUtils.gzUnzip(filename:String):TStringList; var LInput:TFileStream; LUnZip:TZDecompressionStream; begin Result:=TStringList.Create(true); LInput:=TFileStream.Create(filename,fmOpenRead + fmShareDenyNone); LUnZip:=TZDecompressionStream.Create(LInput,15+32); Result.LoadFromStream(LUnzip); LUnZip.Free; LInput.Free; end; Wenn ich den Umweg über eine Datei gehe, welche ich dann in einem zweiten Schritt einlese, geht es zwar, ist aber inperformant, das mache ich eigentlich nur das riesen gz-Files:
Delphi-Quellcode:
Wie bekomme ich es hin, dass ich ohne den Umweg über eine Datei das gz-File komplett in meine TStringList bekomme?
class procedure TStringUtils.gzUnzipToFile(readFile,writeFile:String);
var LInput,LOutput:TFileStream; LUnZip:TZDecompressionStream; begin LOutput:=TFileStream.Create(writeFile,fmCreate); LInput:=TFileStream.Create(readFile,fmOpenRead+fmShareDenyNone); LUnZip:=TZDecompressionStream.Create(LInput,15+32); LOutput.CopyFrom(LUnZip,0); LUnZip.Free; LInput.Free; LOutput.Free(); end; Grüße, Philipp |
AW: Decompress einer gz-Datei mit NULL-Zeichen
Guck dir mal
Delphi-Quellcode:
an.
TStrings.LoadFromStream
|
AW: Decompress einer gz-Datei mit NULL-Zeichen
Ich verstehe die Aussage nicht so ganz: Soll ich mir TStrings.LoadFromStream anschauen, weil es eine Alternative ist (dann kann ich dies sein lassen, weil TStringList ist die Implementierung von TStrings) oder weil ich mir anschauen soll, was in dieser Implementierung schief läuft?
|
AW: Decompress einer gz-Datei mit NULL-Zeichen
Ich habs jetzt nicht getestet aber mit DeineStringList.LoadFromStream() kannst du deinen Stream in deine StringList laden.
Zitat:
|
AW: Decompress einer gz-Datei mit NULL-Zeichen
Liste der Anhänge anzeigen (Anzahl: 1)
Ja, das Problem ist ja, wenn in dem gz-File (Beispiel im ZIP-Anhang) ein NUL-Zeichen enthalten ist, dann liest er nur bis zu NUL und nicht weiter.
Ich habe ein kleines Demoprojekt mit Beispiel gz-Datei hochgeladen, was das Problem verdeutlicht. Die obere TMemo wird aus einer TStringList befüllt und dort steht nur der Header meiner gz-Datei. Aber die untere TMemo wird direkt befüllt und dort steht alles, d.h. hier habe ich schon einen Hinweis auf eine Lösung, weil es in TMemo.Lines funktioniert, warum auch immer, ist aber schrecklich langsam bei großen Dateien. Aber da habe ich schon mal einen Ansatzpunkt, da TMemo.Lines eigentlich auch wieder TStrings ist. |
AW: Decompress einer gz-Datei mit NULL-Zeichen
Schon TBytesStream statt TFileStream getestet?
|
AW: Decompress einer gz-Datei mit NULL-Zeichen
Zitat:
Außerdem: trau der Anzeige des stringlist-Inhalts im Debugger (oder in einem Control) nicht! #0 ist ein string-Terminator für Windows, selbst wenn die stringist deine #0s übernommen hat wird der Text nur bis zum ersten #0 angezeigt. Außerdem: Welches Text-Encoding verwendete die gZippte Datei? |
AW: Decompress einer gz-Datei mit NULL-Zeichen
Ich hab mal vor einiger Zeit eine Unit für Gzip gemäß RFC 1952 erstellt, kannst du ja mal probieren:
![]() Das Feld Zlib ist dann ein Zlib-kompatibler Stream, den sollte man mit dem DecompressionStream lesen können. |
AW: Decompress einer gz-Datei mit NULL-Zeichen
Vielleicht kann man in dem Stream LUnzip einfach die #0 ersetzen oder man guckt mal wieso TStringliast.LoadFromStream bei einer #0 abbricht.
|
AW: Decompress einer gz-Datei mit NULL-Zeichen
Zitat:
Falls in der gz-Datei, sollte das eigentlich kein Problem darstellen, da dann durch das un-gzip daraus wieder eine Datei ohne NULL-Zeichen enstehen sollte. Falls in der unkomprimierten Datei, wundert es mich, dass der Umweg -> als Datei dekomprimieren -> diese Datei in Stringlist laden funktioniert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz