Einzelnen Beitrag anzeigen

PremiumPils

Registriert seit: 26. Sep 2004
21 Beiträge
 
Delphi 7 Personal
 
#1

ZLib - komprimieren mehrerer Dateien!

  Alt 1. Nov 2004, 12:46
Hallo Leute,

im folgen habe ich ein kleines Codestück angehangen, wo beispielhaft zwei Dateien in ein Archiv gepackt werden sollen. Als Basis hierzu nutze ich "ZLib 1.1.4". Nun, die Dateien werden wie ich das gesehen habe normal gepackt, jedoch nicht richtig zusammengefügt. Ich denke, im mit "//->" markierten Bereich liegt der Fehler versteckt. Aber ich steh auf dem Schlauch!

Delphi-Quellcode:
procedure ZLibPacken();
var
  DateiListe : TStrings;
  DateiCounter : Integer;
  Counter : Integer;

  QuellDatei : TFileStream;
  QuellDateiName : String;
  QuellDateiSize : Integer;

  TempDatei : TFileStream;
  KompDatei : TZCompressionStream;

  ZielDatei : TFileStream;
begin
  DateiListe := TStringList.Create;
  try
    DateiListe.Add(ExtractFilePath(Application.ExeName)+'a\a.exe');
    DateiListe.Add(ExtractFilePath(Application.ExeName)+'a\b.exe');
    DateiCounter := DateiListe.Count;

    ZielDatei := TFileStream.Create(ExtractFilePath(Application.ExeName)+'ziel.dat', fmCreate);
    ZielDatei.Write(DateiCounter,SizeOf(DateiCounter));
    for Counter := 0 to DateiCounter-1 do
    begin
      QuellDatei := TFileStream.Create(DateiListe[Counter],fmOpenRead);
      try
        // der originale Dateiname
        QuellDateiName := ExtractFilename(DateiListe[Counter]);
        QuellDateiSize := Length(QuellDateiName);
        ZielDatei.Write(QuellDateiSize,SizeOf(QuellDateiSize));
        ZielDatei.Write(QuellDateiName[1],QuellDateiSize);

        // die originale Dateigröße
        QuellDateiSize := QuellDatei.Size;
        ZielDatei.Write(QuellDateiSize,SizeOf(QuellDateiSize));

        // die originale Datei komprimieren und temporär Speichern
        TempDatei := TFileStream.Create(ExtractFilePath(Application.ExeName)+'a\ziel.tmp', fmCreate);
        KompDatei := TZCompressionStream.Create(TempDatei,zcNone); // zcNone, zcFastest, zcDefault, zcMax
        try
          KompDatei.CopyFrom(QuellDatei,QuellDateiSize);
        finally
          KompDatei.Free;
          TempDatei.Free;
        end;

//-> // die komprimierte Datei an die Zieldatei anhängen
        TempDatei := TFileStream.Create(ExtractFilePath(Application.ExeName)+'a\ziel.tmp', fmOpenRead);
        try
          ZielDatei.CopyFrom(TempDatei,0);
        finally
          TempDatei.Free;
        end;

      finally
        QuellDatei.Free;
      end;
    end;
  finally
    ZielDatei.Free;
    DateiListe.Free;
    DeleteFile(ExtractFilePath(Application.ExeName)+'ziel.tmp');
  end;
end;
Zudem eine ergänzende Frage, wenn der Code oben denn mal funktioniert. Gibt es eine Möglichkeit den Inhalt eines Verzeichnis - sprich alle Dateien (ggf. + Unterverzeichnisse) in die TStringList aufzunehmen?

Viele Grüße,
PP
  Mit Zitat antworten Zitat