Hi,
bisher decompresse ich gz-Dateien mit folgendem Code:
Delphi-Quellcode:
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;
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.
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:
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;
Wie bekomme ich es hin, dass ich ohne den Umweg über eine Datei das gz-File komplett in meine TStringList bekomme?
Grüße, Philipp
Garnicht, macht auch keinerlei Sinn, da #0 innerhalb eines Strings eigentlich kein erlaubtes Zeichen ist. Mißbrauchst Du da einen String um binäre Daten zu speichern?
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?