Thema: Delphi ZLib Problem

Einzelnen Beitrag anzeigen

Benutzerbild von PinKing2
PinKing2

Registriert seit: 9. Aug 2007
29 Beiträge
 
#12

Re: ZLib Problem

  Alt 3. Nov 2007, 00:21
Hallo,

ich versuche auch schon seit einer Woche, eine unter Linux gepackte Datei *.gz unter Delphi 2005 zu entpacken. Ich habe es auch mit Zlib versucht, aber ich bekomme den gleichen Fehler wie oben beschrieben: "Im Projekt gz.exe ist eine Exception der Klasse ECompressionError mit der Meldung 'Fehler' aufgetreten".

Hier mal meine Versuche:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,ZLib;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    procedure Button3Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Decompress(InputFileName, OutputFileName: string);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
Var
  GzDatei,
  ZielDatei:String;
begin
  GzDatei:='c:\test.gz';
  ZielDatei:='c:\test.txt';
  Decompress(GzDatei,ZielDatei);
end;

procedure TForm1.Decompress(InputFileName, OutputFileName: string);
var
  InputStream, OutputStream : TFileStream;
  DeCompressionStream : TDeCompressionStream;
  a : ^byte;
  i : Integer;
begin
  InputStream := TFileStream.Create(InputFileName, fmOpenRead);
  GetMem(a,655360);
  try
    OutputStream := TFileStream.Create(OutputFileName, fmCreate);
    try
      DecompressionStream := TDecompressionStream.Create(InputStream);
      try
        repeat
          i:=DecompressionStream.Read(a^,655360);
          if i>0 then OutputStream.Write(a^,i);
        until i<655360;
        FreeMem(a);
      finally
        DecompressionStream.Free;
      end;
    finally
      OutputStream.Free;
    end;
  finally
    InputStream.Free;
  end;
end;

{procedure TForm1.Decompress(InputFileName, OutputFileName: string);
var InputStream, OutputStream: TFileStream;
  DeCompressionStream: ZLib.TDeCompressionStream;
  Buf: array[0..4095] of Byte;
  Count: Integer;
begin
  InputStream:=TFileStream.Create(InputFileName, fmOpenRead);
  try
    OutputStream:=TFileStream.Create(OutputFileName, fmCreate);
    try
      DecompressionStream := TDecompressionStream.Create(InputStream);
      try
        while true do
        begin
          Count := DecompressionStream.Read(Buf[0], SizeOf(Buf));
          if Count = 0 then
            break
          else
            OutputStream.Write(Buf[0], Count);
        end;
      finally
        DecompressionStream.Free;
      end;
    finally
      OutputStream.Free;
    end;
  finally
    InputStream.Free;
  end;
end; }


procedure TForm1.Button2Click(Sender: TObject);
var c : TCompressionStream;
    m1,m2 : TMemoryStream;
begin
  m1:=TMemoryStream.Create;
  m2:=TMemoryStream.Create;
  m1.LoadFromFile('c:\test.txt');

  c:=TCompressionStream.Create(clMax,m2);
  c.CopyFrom(m1,0);
  c.Free;

  m2.SaveToFile('c:\test.zlib');
end;

procedure TForm1.Button3Click(Sender: TObject);
var c : TDecompressionStream;
    m1,m2 : TMemoryStream;
    a : ^byte;
    i : integer;
begin
    m1:=TMemoryStream.Create;
    m2:=TMemoryStream.Create;
    m1.LoadFromFile('c:\test.zlib');//Das hier funktioniert wenn es vor mit Button2Click erzeugt wurde
    //m1.LoadFromFile('c:\test.gz');//Das hier nicht

    GetMem(a,655360);
    c:=TDecompressionStream.Create(m1);
    repeat
      i:=c.Read(a^,655360);
      if i>0 then m2.Write(a^,i);
    until i<655360;
      c.Free;
      FreeMem(a);

    m2.SaveToFile('c:\test.neu');
end;

end.
Was mir aufgefallen ist:

Packe ich die Datei test.txt nach test.zlib (Button2) ,und entpacke die Datei dann mit Button3 funktioniert alles. Lege ich aber unter c:\ meine gz-Datei ab, und versuche diese zu entpacken, kommt es zu dem Fehler. Der gleiche Fehler taucht bei den Versuchen mit den 2 Versionen der Funktion Decompress.

Ich bin nicht besonders erfahren im Programmieren, und deshalb ist das alles für mich auch nicht so einfach zu verstehen. Meine Frage wäre jetzt, ob es mit zlib überhaupt möglich ist gz-Dateien zu entpacken. Ich hab mich durch die zlib-Homepage geackert und ich meine verstanden zu haben, das es geht, ich verstehe dort nur nicht wie es gehen soll. Ausserdem liegt Delphi 2005 nur die Version 1.4.1 bei, und es gibt da was neueres (1.2.3). Reicht es aus, die Dateien ZLib.pas und ZlibConst.pas im Delphi 2005 Verzeichnis, wo sie liegen, mit denen aus der neuen Version zu ersetzen?

Wäre echt dankbar für jede Art von Hilfe, bis auf eine, die auf Abbrevia als Erstaz für Zlib verweist. Das hab ich 2 Tage lang versucht und dabei hab ich graue Haare bekommen...

Liebe Grüsse,

PinKing2.
  Mit Zitat antworten Zitat