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
Seite 2 von 2     12   
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#11

Re: ZLib Problem

  Alt 11. Okt 2007, 18:19
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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
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
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#13

Re: ZLib Problem

  Alt 3. Nov 2007, 07:49
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')
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#14

Re: ZLib Problem

  Alt 3. Nov 2007, 12:26
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.
  Mit Zitat antworten Zitat
Benutzerbild von PinKing2
PinKing2

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

Re: ZLib Problem

  Alt 9. Nov 2007, 09:27
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.
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#16

Re: ZLib Problem

  Alt 9. Nov 2007, 09:32
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.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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