Autor Beitrag
KlimasDavid
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Sa 19.01.19 14:06 
Hallo,

ich habe folgende Procedure zum entpacken einer GZip datei (*.gz) :
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
  Str1 := 'C:\test.gz');
  if FileExists(Str1) = False then exit;

  FileIn := TFileStream.Create(Str1, fmOpenRead);
  try
    DecompressionStream:=TDecompressionStream.Create(FileIn, 15+16);
    try
      FileOut := TFileStream.Create(Str1 + '.txt', fmCreate);
      try
        FileOut.CopyFrom(DecompressionStream,DecompressionStream.Size);
        finally
      FileOut.free;
      end;
    finally
      DecompressionStream.free;
    end;
  finally
    FileIn.free;
  end;


Die orginale Text Datei im gz ist 15 Mb gross, die FileOut Datei aber nur 300kb. Mehrere hundert Zeilen sind einfach verschwunden. Wenn ich mit windows entpacke, hab ich die richtige grösse. Woran kann das liegen ?

Danke

Moderiert von user profile iconNarses: Beiträge zusammengefasst

Immer noch keine Antwort. Um das problem zu umgehen, entpacke ich meine Datei per WinRar command line. WVielleicht gibt es noch eine bessere lösung ?


Moderiert von user profile iconChristian S.: Topic aus Internet / Netzwerk verschoben am Sa 19.01.2019 um 21:27
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 858
Erhaltene Danke: 139

Win7
VS 2013, VS2015
BeitragVerfasst: So 20.01.19 16:01 
Moin

Ich würde spontan vermuten, dass DecompressionStream.Size die Größe der komprimiertern Daten angibt. Und du in Zeile 10 dann zu wenig kopierst.

ausblenden Delphi-Quelltext
1:
.Create(FileIn, 15+16);					

Was bedeutet eigentlich das 15+16 da?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6311
Erhaltene Danke: 125

Windows 7 + Windows 10
Tokyo Prof + CE
BeitragVerfasst: Mo 21.01.19 07:26 
Wenn ich mir das Beispiel von Emba ansehe, sieht dein Source so aus, als würdest du die Komprimierungs-Methode und nicht dei De-Komprimierungs-Methode verwenden.
KlimasDavid Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Do 24.01.19 20:14 
user profile iconjfheins hat folgendes geschrieben:

Was bedeutet eigentlich das 15+16 da?


16 is flag that gzip stream used, not zlib.
15 is maximum memory usage, to speed-up decompression.

Moderiert von user profile iconChristian S.: Beiträge zusammengefasst

user profile iconjasocul hat folgendes geschrieben Zum zitierten Posting springen:
Wenn ich mir das Beispiel von Emba ansehe, sieht dein Source so aus, als würdest du die Komprimierungs-Methode und nicht dei De-Komprimierungs-Methode verwenden.


Hallo Peter, dein Beispiel gilt nur für Zip dateien, kann aber nicht für gzip angewendet werden. Die Komprimierung ist anders.
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2162
Erhaltene Danke: 399

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Do 24.01.19 21:48 
Guten Abend KlimasDavid,

Indy bietet in der Unit IdCompressorZLib.pas eine Klasse TIdCompressorZLib an, die die Methode DecompressGZipStream() beinhaltet.
Diese verlangt als Parameter einen Eingangs- und Ausgangsstream, sprich Lesen und Erzeugen.

_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)