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 Probleme (https://www.delphipraxis.net/77219-zlib-probleme.html)

Alexander Roth 16. Sep 2006 15:14


ZLib Probleme
 
Hi Leute,

also ich habe diesen Netten Quellcode von dsdt.info
Zitat:

Dateien komprimieren


--------------------------------------------------------------------------------

Die Unit ZLib, die Delphi beiliegt, ermöglicht die ZIP-Komprimierung von Dateien.

uses ZLib, SysUtils;
Packen:
Delphi-Quellcode:
procedure Compress(InputFileName, OutputFileName: string);
var InputStream, OutputStream: TFileStream;
  CompressionStream: ZLib.TCompressionStream;
begin
  InputStream:=TFileStream.Create(InputFileName, fmOpenRead);
  try
    OutputStream:=TFileStream.Create(OutputFileName, fmCreate);
    try
      CompressionStream:=TCompressionStream.Create(clMax, OutputStream);
      try
        CompressionStream.CopyFrom(InputStream, InputStream.Size);
      finally
        CompressionStream.Free;
      end;
    finally
      OutputStream.Free;
    end;
  finally
    InputStream.Free;
  end;
end;
Entpacken:

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;

Da der Code so wunderschön ist habe ich gedacht es gibt keine Probleme damit. Doch wenn ich eine beliebige Datei packe dann erstellt er mir auch schön das Archiv, doch dummerweise gibt WinRar eine Fehlermeldung aus und 7-zip auch und er kann das Archiv nicht öffnen.
Funktioniert der Code bei euch?
Was kann ich falsch gemacht haben?

Fehler die ich von vorne rein ausschließe:
- In- und/ oder Output String falsch (habe es mit einem constanten String versucht)
- Fehler in der zu komprimierenden Datei (ich habe es mit mehreren ausprobiert)

Ich habe schon ein bisschen im Forum gesucht und bin auf diverse Komponenten gestoßen, die entweder ebenfalls packen können.
Doch ich schaffe mir nur sehr ungern eine neue Komponente an, da ich immer nur genau eine Datei packen will und weder Passwort noch etc. brauche.

Gruß Alexander

Der_Unwissende 16. Sep 2006 15:45

Re: ZLib Probleme
 
Hi,
das Problem ist der Teil auf den du verzichten möchtest. Die ZLib ist (imho) eine Bibliothek, die die zip-Kompression unterstützt, während ein .zip Archiv aus deutlich mehr als nur den komprimierten Rohdaten besteht. Immerhin hat ein Archiv halt die Möglichkeit Fehler zu erkennen, mehr als eine Datei aufzunehmen, verschlüsselt zu sein, ...
Das spricht dafür, dass es einen Header gibt, der fehlt dann deiner Datei.

Gruß Der Unwissende

Alexander Roth 16. Sep 2006 15:54

Re: ZLib Probleme
 
Zitat:

Zitat von Der_Unwissende
Das spricht dafür, dass es einen Header gibt, der fehlt dann deiner Datei.

Also, der nette Code und ZLib geben der Datei keinen Header?!
Muss man den irgendwie manuell erstellen, oder gibt es dafür eine Fuktion?
Wieso ist so was wichtiges im Code von dsdt nicht drin?

Dann ist es die einfachste lösung eine Komponente zu nehmen, oder?

Gruß Alexander

Hador 16. Sep 2006 16:12

Re: ZLib Probleme
 
Zitat:

Zitat von Alexander Roth
Wieso ist so was wichtiges im Code von dsdt nicht drin?

Da es für die Kompression von Daten vollkommen unerheblich ist.
Wie das Dateiformat zip aufgebaut is kannst du in der Dateispezifikation nachlesen.

Alexander Roth 16. Sep 2006 16:26

Re: ZLib Probleme
 
Zitat:

Zitat von Hador
Zitat:

Zitat von Alexander Roth
Wieso ist so was wichtiges im Code von dsdt nicht drin?

Da es für die Kompression von Daten vollkommen unerheblich ist.

Ja mag sein, aber das Manko ist ja nicht zu übersehen. Man kann die zip mit keinem Programm öffnen.

Na ja, ich benutze jetzt ZipMaster und es klappt problemlos.

Danke für eure Hilfe

Tschüss

Alexander

SirThornberry 16. Sep 2006 16:29

Re: ZLib Probleme
 
zLib steht ja auch nicht für Zip sondern für die Kompression. Ich verwende es zum Beispiel für Komponenten welche Bilder beinhalten. Somit ist die DFM nicht so groß da die Bilder komprimiert sind. Und in diesem Fall wäre es völlig überflüssig wenn da noch ein Zip-Header vorhanden wäre etc. da ich den Header für mein Bildlistenformat selbst bestimmen will und somit auch weiß wann komprimierte daten beginnen und enden. Wenn da ein Zip-Header wäre, wäre das pure Datenverschwendung.


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