Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   gz-Datei: Decompress liefert nicht alle Zeilen (https://www.delphipraxis.net/209839-gz-datei-decompress-liefert-nicht-alle-zeilen.html)

philipp.hofmann 28. Jan 2022 21:00

gz-Datei: Decompress liefert nicht alle Zeilen
 
Hi,

bisher habe ich gz-Dateien immer mit dem folgenden Code ausgelesen:

Delphi-Quellcode:
function TPriceItemCompress.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 habe ich eine gz-Datei vom Kunden, die nicht vollständig ausgelesen wird, sondern es werden nur die ersten 75 Zeilen ausgelesen. Hatte jemand schon mal dieses Problem?

Grüße, Philipp

KodeZwerg 28. Jan 2022 21:39

AW: gz-Datei: Decompress liefert nicht alle Zeilen
 
zLib liefert doch ein Binäres Archiv. Also ein array of Byte sozusagen. Beim entpacken muss doch auch erstmal alles in ein array of byte um es dann in was anderes zu Konvertieren.
Bestimmt habe ich da gerade einen Denkfehler.

himitsu 28. Jan 2022 23:33

AW: gz-Datei: Decompress liefert nicht alle Zeilen
 
Da ist doch nicht etwa eine #0 in den "Text" reingerutscht? (die Lesefunktion des TStrings arbeitet leider blöderweise mit PChar)

philipp.hofmann 29. Jan 2022 07:36

AW: gz-Datei: Decompress liefert nicht alle Zeilen
 
Hier der Umweg über einen String: Der String und auch schon LUnZip.Size sind zu kurz:

Delphi-Quellcode:
var
   LInput:TFileStream;
   LUnZip:TZDecompressionStream;
   strOutput: TStringStream;
   Splitted: TArray<String>;
   i:integer;
begin
   Result:=TStringList.Create(true);
   LInput:=TFileStream.Create(filename,fmOpenRead + fmShareDenyNone);
   LUnZip:=TZDecompressionStream.Create(LInput,15+32);
   strOutput:= TStringStream.Create;
   strOutput.CopyFrom(LUnZip, LUnZip.Size);
   i:=length(strOutput.DataString);
   Splitted := strOutput.DataString.Split([#10]);
   strOutput.free();
   for i:=0 to length(splitted)-1 do
     result.add(splitted[i]);
   LUnZip.Free;
   LInput.Free;
end;

KodeZwerg 29. Jan 2022 07:52

AW: gz-Datei: Decompress liefert nicht alle Zeilen
 
Delphi-Quellcode:
var
   LInput:TFileStream;
   LUnZip:TZDecompressionStream;
   strOutput: TStringStream;
   Splitted: TArray<String>;
   i, x:integer;
begin
   Result:=TStringList.Create(true);
   LInput:=TFileStream.Create(filename,fmOpenRead + fmShareDenyNone);
   LUnZip:=TZDecompressionStream.Create(LInput,15+32); // '15+32' macht den Unterschied zwischen data-error und 'juhu'
   strOutput:= TStringStream.Create;
   strOutput.CopyFrom(LUnZip, LUnZip.Size);
   for x := Low(strOutput.DataString) to High(strOutput.DataString) do // das mit dem LUnZip machen... ich weiß nur gerade nicht wie
     if strOutput.DataString[x] = #0 then
       strOutput.DataString[x] = VK_RETURN;
   i:=length(strOutput.DataString);
   Splitted := strOutput.DataString.Split([#10]);
   strOutput.free();
   for i:=0 to length(splitted)-1 do
     result.add(splitted[i]);
   LUnZip.Free;
   LInput.Free;
end;
Könnte das vielleicht helfen? Nur hier getippt um zu veranschaulichen was ich meine...

philipp.hofmann 29. Jan 2022 09:12

AW: gz-Datei: Decompress liefert nicht alle Zeilen
 
Wie gesagt, LUnZip.Size ist schon zu kurz. Da helfen keine Anpassungen danach. Mir ist nur unklar, warum er nicht das komplette File liest. Wenn ich die Datei mit 7zip entpacke, ist sie vollständig.

KodeZwerg 29. Jan 2022 09:25

AW: gz-Datei: Decompress liefert nicht alle Zeilen
 
Was passiert denn wenn du das entpackte einfach mal als binär stream auf festplatte speicherst und anschaust?
Also ohne weitere konvertierung direkt schreiben.
Wenn es immernoch falsch ist, kann es ja nur am verwendeten komprimierungsverfahren liegen, was dein zlib nicht ganz beherrscht.

philipp.hofmann 29. Jan 2022 12:28

AW: gz-Datei: Decompress liefert nicht alle Zeilen
 
Der unkomprimierte Teil ist ja richtig, er ist nur nach 75 von rund 500 Zeilen abgeschnitten und ich sehe, dass die Size von LInput (also der reinen Datei) noch richtig ist und die Size von LUnzip ist dann zu kurz.

KodeZwerg 29. Jan 2022 12:59

AW: gz-Datei: Decompress liefert nicht alle Zeilen
 
Ich kann Dir nicht weiterhelfen aber Du hast ja Dir selbst schon eine passende Antwort gegeben "mit 7-zip funktioniert alles".... dann nutze das doch für dich. :-D
(Gibt es auch für Delphi/Pascal)

freimatz 29. Jan 2022 14:12

AW: gz-Datei: Decompress liefert nicht alle Zeilen
 
Zitat:

Zitat von himitsu (Beitrag 1501387)
Da ist doch nicht etwa eine #0 in den "Text" reingerutscht? (die Lesefunktion des TStrings arbeitet leider blöderweise mit PChar)

Denke ich auch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:33 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz