Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi ZLib - komprimieren mehrerer Dateien! (https://www.delphipraxis.net/33070-zlib-komprimieren-mehrerer-dateien.html)

PremiumPils 1. Nov 2004 11:46


ZLib - komprimieren mehrerer Dateien!
 
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

fiasko 1. Nov 2004 11:52

Re: ZLib - komprimieren mehrerer Dateien!
 
Kannst du bitte delphi Tags nehmen? Da bricht man sich ja sonst die Augen!

Die ZLib kann nur Daten packen, hat kennt aber keine Verzeichnisse oder Dateien. Dafür bemüht man andere Tools wie z.B. tar und packt dann die große Datei mit der zlib.

PremiumPils 1. Nov 2004 11:52

Re: ZLib - komprimieren mehrerer Dateien!
 
Ich bin ein Trottel... sorry! Aber so blöd wie ich muss man erstmal sein! :stupid: Die ZielDatei wurde einfach ins falsche Verzeichnis geschrieben!

Aber die letzte Frage ist noch immer aktuell... :wall:

Peinliche Grüße,
PP

CalganX 1. Nov 2004 12:21

Re: ZLib - komprimieren mehrerer Dateien!
 
Hi,
schau dir mal die Funktionen Delphi-Referenz durchsuchenFindFirst und Delphi-Referenz durchsuchenFindNext an. Wenn du danach suchst, findest du auch was in der Delphi-PRAXiS.

Chris

PS: Sonst aber gilt: zwei Fragen, zwei Threads. ;) Danke.


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