AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein gz-Datei: Decompress liefert nicht alle Zeilen
Thema durchsuchen
Ansicht
Themen-Optionen

gz-Datei: Decompress liefert nicht alle Zeilen

Ein Thema von philipp.hofmann · begonnen am 28. Jan 2022 · letzter Beitrag vom 31. Jan 2022
Antwort Antwort
Seite 1 von 3  1 23      
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
893 Beiträge
 
Delphi 10.4 Sydney
 
#1

gz-Datei: Decompress liefert nicht alle Zeilen

  Alt 28. Jan 2022, 22:00
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

Geändert von philipp.hofmann (28. Jan 2022 um 22:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: gz-Datei: Decompress liefert nicht alle Zeilen

  Alt 28. Jan 2022, 22:39
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.088 Beiträge
 
Delphi 12 Athens
 
#3

AW: gz-Datei: Decompress liefert nicht alle Zeilen

  Alt 29. Jan 2022, 00:33
Da ist doch nicht etwa eine #0 in den "Text" reingerutscht? (die Lesefunktion des TStrings arbeitet leider blöderweise mit PChar)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (29. Jan 2022 um 00:36 Uhr)
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
893 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: gz-Datei: Decompress liefert nicht alle Zeilen

  Alt 29. Jan 2022, 08:36
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;

Geändert von philipp.hofmann (29. Jan 2022 um 10:05 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: gz-Datei: Decompress liefert nicht alle Zeilen

  Alt 29. Jan 2022, 08:52
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...
Gruß vom KodeZwerg

Geändert von KodeZwerg (29. Jan 2022 um 09:17 Uhr)
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
893 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: gz-Datei: Decompress liefert nicht alle Zeilen

  Alt 29. Jan 2022, 10:12
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: gz-Datei: Decompress liefert nicht alle Zeilen

  Alt 29. Jan 2022, 10:25
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
893 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: gz-Datei: Decompress liefert nicht alle Zeilen

  Alt 29. Jan 2022, 13:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: gz-Datei: Decompress liefert nicht alle Zeilen

  Alt 29. Jan 2022, 13:59
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.
(Gibt es auch für Delphi/Pascal)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
freimatz

Registriert seit: 20. Mai 2010
1.447 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: gz-Datei: Decompress liefert nicht alle Zeilen

  Alt 29. Jan 2022, 15:12
Da ist doch nicht etwa eine #0 in den "Text" reingerutscht? (die Lesefunktion des TStrings arbeitet leider blöderweise mit PChar)
Denke ich auch.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:36 Uhr.
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