Einzelnen Beitrag anzeigen

endeffects

Registriert seit: 27. Jun 2004
450 Beiträge
 
#1

Probleme mit zLib (beschädigte Archive)

  Alt 26. Nov 2005, 16:19
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;
  Mit Zitat antworten Zitat