Home » Tutorials » Third-Party-Komponenten » DelphiZip

DelphiZip

Der statische Ansatz

Entpacken

Für das Entpacken benötigt man die mitgelieferte DLL ‚UnzDll.dll‘. Der Pfad muss dem Property DLLDirectory der Zipmaster-Komponente übergeben werden. Ich empfehle die Datei immer ins Verzeichnis deiner Anwendung zu kopieren und diesen Pfad dort einzutragen:

Zipmaster1.DLLDirectory:=ExtractFilePath(ParamStr(0));

Für das Entpacken sind nun eigentlich nur noch zwei Eigenschaften von großer Wichtigkeit: Einmal gibt es da die Eigenschaft ZipFilename, dem der komplette Pfad+Dateiname des Ziparchivs übergeben werden muss, und der Parameter ExtrBaseDir, der den Zielort des Entpackvorgangs angibt.
Meistens bestehen Archive aus mehreren Dateien. Nicht immer ist es erforderlich alle Dateien zu entpacken. Welche Dateien extrahiert werden sollen, müssen der auf dem Typ TStrings basierender Eigenschaft FSpecArgs übergeben werden. Mit der Methode Add können der Liste Masken hinzugefügt, über Delete Masken gelöscht werden. Es stehen sämtliche Möglichkeiten der Klasse TStrings zur Verfügung. Sollen aus dem Archiv nur *.pas-Dateien extrahiert werden reicht folgender Eintrag:

ZipMaster1.FSpecArgs.Add('*.pas');

Sollen generell alle Dateien/Verzeichnisse entpackt werden reicht es, die Liste leer zu lassen, bzw. zu leeren.
Nun kann mittels der Methode Extract das Archiv entpackt werden. Die ganze Extract-Procedure könnte folgenden Aufbau haben:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with Zipmaster1 do
  begin
    DLLDirectory:=ExtractFilePath(ParamStr(0));
    ZipFilename:='C:\Archiv.zip';
    ExtrBaseDir:='C:\';
    Extract;
  end;
end;

Der with-Block gestaltet den Aufruf etwas übersichtlicher. Ändert sich die Position der DLLs nicht, reicht es aus den Pfad einmal, z.B. im OnCreate-Ereignis zu setzen. In dieser Ausführung stellt die Komponente evtl. vorhanden Verzeichnisse in dem Archiv nicht wieder her. Dazu bedarf es einer Änderung der Extrahierungs-Optionen ExtrOptions. Dazu muss der Menge der Wert ExtrDirNames hinzugefügt werden. Sollen vorhanden Dateien überschrieben werden reicht es aus, die Menge um den Wert ExtrOverWrite zu erweitern:

Zipmaster1.ExtrOptions:=ZipMaster1.ExtrOptions + [ExtrDirNames, ExtrOverwrite];

Bei meinen Tests hat sich herausgestellt, dass ExtrBaseDir nicht korrekt arbeitet. Für das Extrahieren von Verzeichnissen wird weiterhin das aktuelle Verzeichnis verwendet. Dieses Verzeichnis lässt sich mit GetCurrentDir ermitteln. In der Hilfe-Datei steht, dass dieses Verzeichnis später zum aktuellen Arbeitsverzeichnis gemacht wird:

    The Unzip DLL will make this directory the current directory before extracting any files.

Zu funktionieren scheint es aber nicht. Wir müssen, das Extract-Verzeichnis also selbst als Arbeitsverzeichnis setzen. Dies geschieht mit der Funktion SetCurrentDir, die als Parameter das Verzeichnis erwartet und True zurückgibt falls die Funktion erfolgreich war.
Möchte man also komplette Verzeichnisstrukturen entpacken, sieht ein möglicher Aufruf so aus:

procedure TForm1.Button1Click(Sender: TObject);
begin
  with Zipmaster1 do
  begin
    DLLDirectory:=ExtractFilePath(ParamStr(0));
    ZipFilename:='C:VerzeichnisArchiv.zip';
    ExtrOptions:=ExtrOptions + [ExtrDirNames, ExtrOverwrite];
    if SetCurrentDir('C:Verzeichnis') then
      Extract;
  end;
end;

In diesem Beispiel werden vorhandene Dateien überschrieben.
In dieser Tabelle werden die verschiedenen Einstellungen erläutert:

Wert Erläuterung
ExtrDirNames Die im Archiv gespeicherte Verzeichnisstruktur wird wiederhergestellt.
ExtrOverWrite Vorhandene Dateien werden überschrieben
ExtrFreshen Es werden nur ältere Dateien überschrieben.
ExtrUpdate Es werden nur nicht-vorhandene Dateien aus dem Archiv extrahiert.
ExtrTest Das Zip-Archiv wird auf Fehler überprüft (CRC)