Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi ZLib Problem (https://www.delphipraxis.net/101193-zlib-problem.html)

Telefonkabel 9. Okt 2007 20:04


ZLib Problem
 
Hy!
Wollte letztens die Unit ZLib verwenden, doch erscheint jedes mal die Fehlermeldung:
[Fataler Fehler] zlib.pas(42): Datei nicht gefunden: 'zconf.inc'


Warum das?
In Delphi müsste doch alles enthalten sein, was ich brauche um diese Unit zu nutzen.

Bernhard Geyer 9. Okt 2007 21:52

Re: ZLib Problem
 
Zitat:

Zitat von Telefonkabel
Warum das?
In Delphi müsste doch alles enthalten sein, was ich brauche um diese Unit zu nutzen.

Wieso das? Die Meldung ist doch eindeutig. In zlib.pas wird per {$INCLUDE} eine zconf.inc eingebunden die nicht gefunden wird. Such mal auf deiner Festplatte ob du irgendwo eine solche Datei findest.

Telefonkabel 10. Okt 2007 16:03

Re: ZLib Problem
 
Das ist ja auch klar, nur gibt es nirgendwo solch eine Datei und deshalb frag ich mich warum dann Delphi diese Unit anbietet, wenn sie nicht ohne Weiteres nutzbar ist.

Nuclear-Ping 10. Okt 2007 16:11

Re: ZLib Problem
 
Warum denn nicht Herrn Google fragen ...? 10sek Suche > 20h auf Antwort warten.

http://www.koders.com/noncode/fid0D3...470.aspx?s=zip
Delphi-Quellcode:
{ -------------------------------------------------------------------- }

{$DEFINE MAX_MATCH_IS_258}

{ Compile with -DMAXSEG_64K if the alloc function cannot allocate more
  than 64k bytes at a time (needed on systems with 16-bit int). }

{- $DEFINE MAXSEG_64K}
{$IFDEF VER70}
  {$DEFINE MAXSEG_64K}
{$ENDIF}
{$IFNDEF WIN32}
  {$DEFINE UNALIGNED_OK}  { requires SizeOf(ush) = 2 ! }
{$ENDIF}

{$UNDEF DYNAMIC_CRC_TABLE}
{$UNDEF FASTEST}
{$define patch112}        { apply patch from the zlib home page }
{ -------------------------------------------------------------------- }
{$IFDEF WIN32}
  {$DEFINE Delphi32}
  {- $DEFINE Delphi5}  { keep compiler quiet }
{$ENDIF}

{$IFDEF DPMI}
  {$DEFINE MSDOS}
{$ENDIF}

{$IFDEF FPC}
 {$DEFINE Use32}
 {$UNDEF DPMI}
 {$UNDEF MSDOS}
 {$UNDEF UNALIGNED_OK}  { requires SizeOf(ush) = 2 ! }
 {$UNDEF MAXSEG_64K}
 {$UNDEF Delphi32}
{$ENDIF}

Bernhard Geyer 10. Okt 2007 16:17

Re: ZLib Problem
 
D20076 hat zwar eine Zlib-datei mitgeliefert, aber es wird keine entsprechende Inc-Datei eingebunden.

Telefonkabel 10. Okt 2007 20:44

Re: ZLib Problem
 
OK, danke euch. Das hat soweit geklappt.
Aber jetzt habe ich das Problem, dass ich einen Fehler beim ausführen des Programms in der Prozedur:
Delphi-Quellcode:
procedure 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;
An der Stelle
Delphi-Quellcode:
Count := DecompressionStream.Read(Buf[0], SizeOf(Buf));
erscheint als Fehler: "Fehler."
Und ich würde gerne wissen, warum.

Funktionsaufruf:
decompress('C:\Dokumente und Einstellungen\...\test.php','C:\Dokumente und Einstellungen\...\test2.php');

Was ist falsch, oder warum geht es nicht?

Progman 10. Okt 2007 20:52

Re: ZLib Problem
 
du willst eine php-Datei decomprimieren? ;)

Telefonkabel 10. Okt 2007 21:03

Re: ZLib Problem
 
Auch wenn ich eine *.gz oder *.html oder, oder angebe, geht es nicht.
Gibt es in Indy nicht direkt die Möglichkeit das sofort zu dekomprimieren?

Nuclear-Ping 11. Okt 2007 12:04

Re: ZLib Problem
 
Und welcher Fehler kommt ist ein Geheimnis? ^^ Oder ist "Funktionsaufruf: decompress ..." bereits die Fehlermeldung?

Telefonkabel 11. Okt 2007 15:51

Re: ZLib Problem
 
Es erscheint an der oben genannten Stelle eine Exception und zwar mit der Fehlermeldung "Fehler".
Mehr nicht ^^

OregonGhost 11. Okt 2007 17:19

Re: ZLib Problem
 
Hmm? Ist ZLib nicht reine ZIP-Komprimierungsunterstützung, ganz ohne Dateihandling etc.? Oder hast du die Dateien vorher auch mit der ZLib komprimiert?
Ansonsten könnte ein Blick auf http://www.zlib.net/ hilfreich sein.

PinKing2 2. Nov 2007 23:21

Re: ZLib Problem
 
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... :wink:

Liebe Grüsse,

PinKing2.

Union 3. Nov 2007 06:49

Re: ZLib Problem
 
Und was ist an Abbrevia so schlimm? Im Grunde sind doch für das eigentliche Packen / Entpacken nur jeweils 3 Zeilen nötig:
Delphi-Quellcode:
unit Compress;

interface

uses Classes, Sysutils, Abgztyp, Abutils;


function GZipPack(sFile, sArchiv : string) : boolean;
function GZipUnpack(sArchiv, sFilePath : string; var sFileName : string) : boolean;
function IsGzip(sFile : string) : boolean;

implementation

function GZipPack(sFile, sArchiv : string) : boolean;
var
   gArchiv : TAbGzipArchive;
   FileDate : integer;
   DosFileDate : integer;
   FHandle : integer;
begin
   try
      FileDate := FileAge(sFile);
      gArchiv := TAbGZipArchive.Create(ExpandFileName(sArchiv), fmCreate); // Relevante Zeile 1
      gArchiv.AddFiles(sFile, faAnyFile);                                  // Relevante Zeile 2
      gArchiv.Save;                                                        // Relevante Zeile 3

      FreeAndNil(gArchiv);

      // Setzen des Archivdatums auf Datum der Eingabedatei
      FHandle := FileOpen(ExpandFileName(sArchiv), fmOpenWrite);
      if FHandle >= 0 then
      begin
         FileSetDate(FHandle, FileDate);
         FileClose(FHandle);
      end;

      result := true;
   finally
      if Assigned(gArchiv) then
         gArchiv.Free;
   end;
end;

function GZipUnpack(sArchiv, sFilePath : string; var sFileName : string) : boolean;
var
   gArchiv : TAbGZipArchive;
   iFile : integer;
begin
   try
      gArchiv := TAbGZipArchive.Create(sArchiv, fmOpenRead); // Relevante Zeile 1
      gArchiv.Load;                                         // Relevante Zeile 2
      // GZip kann nur eine Datei pro Archiv
      iFile := 0;
      if sFilePath = '' then
         sFilePath := GetCurrentDir;

      sFilePath := IncludeTrailingBackslash(sFilePath);
      ForceDirectories(sFilePath);
      sFileName := sFilePath+ExtractFileName(gArchiv.Items[iFile].FileName);
      gArchiv.Extract(gArchiv.Items[iFile], sFileName);     // Relevante Zeile 3

      result := true;
   finally
      if Assigned(gArchiv) then
         gArchiv.Free;
   end;
end;

function IsGZip(sFile : string) : boolean;
type
   TGZipBuffer = record
      Id1, Id2, Method : byte;
   end;
var
   FileStream : TFileStream;
   GZipBuffer : TGZipBuffer;
begin
   result := false;
   if FileExists(sFile) then
   begin
      try
         FileStream := TFileStream.Create(sFile, fmOpenRead);
         FileStream.ReadBuffer(GZipBuffer, Sizeof(GZipBuffer));
         result := (GZipBuffer.Id1 = $1F) and
                   (GZipBuffer.Id2 = $8B) and
                   (GZipBuffer.Method = $08)
      finally
         if Assigned(FileStream) then
            FileStream.Free;
      end;
   end;
end;
end.
Packen z.B. mit GzipPack('test.txt', 'test.gz')
Entpacken mit GzipUnpack('test.gz', 'c:\temp', AFileName)
Testen ob es ein GZip ist mit IsGzip('c:\bla.txt')

Muetze1 3. Nov 2007 11:26

Re: ZLib Problem
 
Bei einer reinen GZ Datei liegt afaik ein Header vorne in der Datei und nicht sofort komprimierte Daten. Ich vermute damit tut sich zlib schwer und kommt zu dem Fehler.

Andere Möglichkeit: die GZ Datei wurde einfach mit einer höheren Version eingepackt, welche dadurch vllt. ein neuen Algorithmus implementiert, welcher der zlib nicht bekannt ist.

PinKing2 9. Nov 2007 08:27

Re: ZLib Problem
 
Hallo Union,

Entschuldigung, dass ich mich erst so spät melde, aber
ich mache das Ganze eher hobbymaessig und komm nicht immer
dazu.

Vielen Dank für den Weg mit Abbrevia, jetzt hab ich es hinbekommen.
Hab letztens einfach nicht den Dreh damit gefunden.

Trotz allem hätte mich schon mal interessiert, ob es mit irgendeiner
Version von zLib möglich wäre gz-Dateien zu entpacken. Wenn also noch einer
Erfahrung damit hat, wäre ich schon noch interessiert die zu erfahren.

Gruß, PinKing2.

alzaimar 9. Nov 2007 08:32

Re: ZLib Problem
 
Zlib ist doch, wie schon erwähnt eine reine Komprimierungsbibliothek, (fast) ohne Zusatzinformation. GZ dagegen ist ein Dateiformat, also steht in der Datei vor den komprimierten Daten noch einiges an Nutzinformation. Besorg Dir doch einfach die Header-Informationen. Dann sollte das funktionieren.

Ich verwende ZLib nur zum dekomprimieren von zuvor mit ZLib komprimierten Daten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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