Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Probleme mit zLib (beschädigte Archive) (https://www.delphipraxis.net/57775-probleme-mit-zlib-beschaedigte-archive.html)

endeffects 26. Nov 2005 15:19


Probleme mit zLib (beschädigte Archive)
 
Hallo,

ich habe leider ein Problem mit zLib,
ich möchte mehrere Dateien in ein zip Archiv packen
und benutze dazu folgenden Code.

Soweit so gut, alles läuft ohne Probleme
durch den Compiler, allerdings sind die
so erzeugten Archive offensichtlich defekt,
zumindestens meldet mir das Winrar und Winzip.

Ich habe auch schon die Komponente ZipMaster
probiert, diese wird aus mir unerfindlichen Gründen
allerdings nicht richtig installiert.

Hat Jemand vielleicht eine Idee wie ich das Ganze lösen kann?

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  slFile: TStringList;
begin
 slFile := TStringList.Create;
  try
    slFile.add('C:\source\1.txt');
    CompressFiles(slFile, 'C:\source\test.zip');
  finally
    slFile.FRee;
  end;  
end;

procedure CompressFiles(Files : TStrings; const Filename : String);
var
  infile, outfile, tmpFile : TFileStream;
  compr : TCompressionStream;
  i,l : Integer;
  s : String;

begin
  if Files.Count > 0 then
  begin
    outFile := TFileStream.Create(Filename,fmCreate);
    try
      { the number of files }
      l := Files.Count;
      outfile.Write(l,SizeOf(l));
      for i := 0 to Files.Count-1 do
      begin
        infile := TFileStream.Create(Files[i],fmOpenRead);
        try
          { the original filename }
          s := ExtractFilename(Files[i]);
          l := Length(s);
          outfile.Write(l,SizeOf(l));
          outfile.Write(s[1],l);
          { the original filesize }
          l := infile.Size;
          outfile.Write(l,SizeOf(l));
          { compress and store the file temporary}
          tmpFile := TFileStream.Create('tmp',fmCreate);
          compr := TCompressionStream.Create(clNone,tmpfile);
          try
            compr.CopyFrom(infile,l);
          finally
            compr.Free;
            tmpFile.Free;
          end;
          { append the compressed file to the destination file }
          tmpFile := TFileStream.Create('tmp',fmOpenRead);
          try
            outfile.CopyFrom(tmpFile,0);
          finally
            tmpFile.Free;
          end;
        finally
          infile.Free;
        end;
      end;
    finally
      outfile.Free;
    end;
    DeleteFile('tmp');
  end;
end;

tommie-lie 26. Nov 2005 15:40

Re: Probleme mit zLib (beschädigte Archive)
 
Bist du dir denn sicher, daß die Datenstrukturen von WinZIP gelesen werden können? PKZIP hat IIRC irgendeine Art von Filetable am Ende des Datenstroms gespeichert, diese müsstest du nachbilden (auf www.wotsit.org müsste sich was passendes finden lassen). zlib implementiert immerhin nur den PKZIP-Algorithmus, die Bibliothek erzeugt nicht per se valide ZIP-Archive.


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