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.