AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ZLib Problem

Ein Thema von Telefonkabel · begonnen am 9. Okt 2007 · letzter Beitrag vom 9. Nov 2007
Antwort Antwort
Benutzerbild von PinKing2
PinKing2

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

Re: ZLib Problem

  Alt 2. Nov 2007, 23: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
Antwort Antwort


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 06:45 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz