Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zip-Dateien beschädigt (https://www.delphipraxis.net/50807-zip-dateien-beschaedigt.html)

Patrick 1. Aug 2005 10:08


Zip-Dateien beschädigt
 
Hallo, ich hätte da mal wieder ein Problem.

Also ich zippe und unzippe mit folgender zusammengebastelter Unit Dateien:
Delphi-Quellcode:
unit compress;

interface
uses ZLib, Windows, SysUtils, Variants, Classes, Graphics, Controls, Dialogs;

  procedure CompressFiles(Files : TStrings; const Filename : String);
  procedure DecompressFiles(const infile : TMemoryStream);

implementation

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(clMax,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;

procedure DecompressFiles(const infile : TMemoryStream);
var
  dest,s : String;
  decompr : TDecompressionStream;
  outfile : TFilestream;
  i,l,c : Integer;
begin
  // IncludeTrailingPathDelimiter (D6/D7 only)
  //dest := IncludeTrailingPathDelimiter(DestDirectory);

  infile.Position:=0;
  try
    { number of files } 
    infile.Read(c,SizeOf(c));
    for i := 1 to c do
    begin
      { read filename } 
      infile.Read(l,SizeOf(l));
      SetLength(s,l);
      infile.Read(s[1],l);
      { read filesize } 
      infile.Read(l,SizeOf(l));
      { decompress the files and store it } 
      s := dest+s; //include the path
      outfile := TFileStream.Create(s,fmCreate);
      decompr := TDecompressionStream.Create(infile);
      try
        outfile.CopyFrom(decompr,l);
      finally
        outfile.Free;
        decompr.Free;
      end;
    end;
  finally
 
  end;
end;

end.
Jetzt habe ich aber das Problem, dass ich die damit erzeugten Zip-Dateien nicht mit dem in Windows XP implementierten Zipper öffnen kann, da kommt immer die hübsche Fehlermeldung, dass diese beschädigt seien...
Wie muss ich meine Prozeduren ändern, dass ich sie auch mit Windows öffnen kann?

s.h.a.r.k 1. Aug 2005 10:52

Re: Zip-Dateien beschädigt
 
Ich schätze mal, dass Windows diese Komprimierung nicht unterstützt. Kann ja mal ne *.mp3-Datei zu einer *.zip-Datei machen - Dann versucht Windows ebenfalls die Daten zu öffnen, aber es sollte die selbe Fehlermeldung kommen!

Bernhard Geyer 1. Aug 2005 12:11

Re: Zip-Dateien beschädigt
 
Zitat:

Zitat von Patrick
Jetzt habe ich aber das Problem, dass ich die damit erzeugten Zip-Dateien nicht mit dem in Windows XP implementierten Zipper öffnen kann, da kommt immer die hübsche Fehlermeldung, dass diese beschädigt seien...
Wie muss ich meine Prozeduren ändern, dass ich sie auch mit Windows öffnen kann?

Ich denke dein Header passt nicht mit den im ZIP-Format definierten Header.
Schau mal bei Abbrevia nach oder nimm gleich von dort die ZIP-Komprimierung


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