.NET: ZIP-(Archiv) API im .NET Framework 4.5 (inkl. Beispielanwendung)

Mit dem Release des .NET 4.5 Frameworks hat Microsoft dem System.IO.Compression-Namespace neue Klassen hinzugefügt. Diese Klassen stellen Methoden für das Packen und Entpacken von ZIP-Archiven bereit. Dies war vor den Zeiten den .NET Frameworks 4.5 nur mit zusätzlichen Bibliotheken möglich. Nachfolgend die Klassen, die neu hinzugefügt wurden:

ZIP API-Klassen im .NET Framework 4.5

KlasseBeschreibung
ZipArchiveStellt ein Paket komprimierter Dateien im Zip-Archiv-Format dar.
ZipArchiveEntryStellt eine komprimierte Datei in einem Zip-Archiv dar.
ZipFileStellt statische Methoden zum Erstellen, Extrahieren und Öffnen von Zip-Archiven bereit.
ZipFileExtensionsStellt Erweiterungsmethoden für die ZipArchive- und ZipArchiveEntry-Klassen bereit.

Die ZipArchive-Klasse bietet Möglichkeiten um mit einem Paket von komprimierten Dateien zu arbeiten. Das Paket enthält einen Eintrag für jede komprimierte Datei. Die Klasse stellt die folgenden Funktionen bereit:

  • einen bestimmten Eintrag mit der GetEntry-Methode abrufen
  • Abruf einer Auflistung von Einträgen über die Entries-Eigenschaft
  • Erstellen eines neuen Eintrags innerhalb des ZIP-Archivs mit der CreateEntry-Methode

Damit static-Methoden ein ZIP Sie aus einem Verzeichnis oder Extrahieren Sie einem ZIP-Archiv zu einem Verzeichnis, finden die ZipFile-Klasse erstellen.

Die ZipFile-Klasse bietet bequeme static-Methoden für das Arbeiten mit ZIP-Archiven. Die folgenden Methoden sind verfügbar:

  • CreateFromDirectory (3 Überladungen) – Erstellt ein ZIP-Archiv, das die Dateien und Verzeichnisse im angegebenen Verzeichnis enthält, die angegebene Komprimierungsebene und der angegebenen Zeichencodierung für Eintragsnamen verwendet und optional das Basisverzeichnis mit einbezieht.
  • ExtractToDirectory (2 Überladungen) – Extrahiert alle Dateien im angegebenen ZIP-Archiv in ein Verzeichnis im Dateisystem und verwendet die angegebene Zeichencodierung für Eintragsnamen.
  • Open (2 Überladungen) – Öffnet ein Zip-Archiv im angegebenen Pfad im angegebenen Modus und mit der angegebenen Zeichencodierung für Eintragsnamen.
  • OpenRead – Öffnet ein Zip-Archiv für das Lesen im angegebenen Pfad.

Um die oben genannten Methoden verwenden zu können muss die Assembly System.IO.Compression.FileSystem in das Projekt eingebunden werden.

ZipApiAssemblyReferences

Hinweis:

Die Assembly System.IO.Compression.FileSystem ist nicht für Windows Store Apps verfügbar. Daher Klasse sind die ZipFile-Klasse und ZipFileExtensions (die auch in der Assembly System.IO.Compression.FileSystem Assembly liegen) nicht in Windows Store Apps verfügbar. In Windows Store App arbeitet man mit komprimierten Dateien, indem man die Methoden der Klassen ZipArchive, ZipArchiveEntry, DeflateStream und GZipStream verwendet.

Um die einzelnen Methoden jetzt genauer zu erläutern habe ich eine kleine Beispielanwendungen geschrieben. Mit dieser einfachen Anwendung ist es möglich ZIP-Archive zu erstellen und zu entpacken. Das UI ist folgendermaßen aufgebaut:

ZipSampleApplication_01

Diese einfache Beispielanwendung ist in WPF implementiert und nutzt die Klassen und Methoden aus den System.IO.Compression und System.IO.Compression.FileSystem Assemblies.

Erstellung eines ZIP-Archivs

Um ein ZIP-Archiv zu erstellen gibt es die folgende Methode:

Die verwendete Überladung Methode CreateFromDirectory erhält im oben gezeigten Beispiel 4-Parameter, die alle über DataBinding versorgt werden. Die verwendete Methode besitzt den folgenden Aufbau:

Je nach verwendeter Überladung erhält die Methode CreateFromDirectory die folgenden Parameter:

Parameter der Methode CreateFromDirectory

ParameternameBeschreibung
sourceDirectoryNameTyp: System.String
Der Pfad zum Verzeichnis, das archiviert werden soll, angegeben als relativer oder absoluter Pfad. Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert.
destinationArchiveFileNameTyp: System.String
Der Pfad des zu erstellenden Archivs, angegeben als relativer oder absoluter Pfad. Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert.
compressionLevelTyp: System.IO.Compression.CompressionLevel
Einer der Enumerationswerte, der angibt, ob Geschwindigkeit oder Komprimierungseffektivität priorisiert wird, wenn der Eintrag erstellt.
includeBaseDirectoryTyp: System.Boolean
true, um den Verzeichnisnamens von sourceDirectoryName am Stamm des Archivs einzuschließen; false, um nur der Inhalt des Verzeichnisses einzuschließen.
entryNameEncodingTyp: System.Text.Encoding
Die Codierung, die beim Lesen oder Schreiben von Eintragsnamen in diesem Archiv verwendet werden soll. Geben Sie einen Wert für diesen Parameter nur an, wenn eine Codierung für die Interoperabilität mit ZIP-Archiv-Tools und -Bibliotheken erforderlich ist, die die UTF-8-Codierung für Eintragsnamen nicht unterstützen.

Extrahieren eines kompletten ZIP-Archivs

Um ein komplettes Archiv zu extrahieren könnte die Methode wie folgt aussehen:

Von der Methode ExtractToDirectory existieren 2-Überladungen. Diese Methode ist wie folgt aufgebaut:

Je nach verwendeter Überladung stehen die folgenden Parameter zur Verfügung:

Parameter der Methode ExtractToDirectory

ParameternameBeschreibung
sourceArchiveFileNameTyp: System.String
Der Pfad zum Archiv, das extrahiert werden soll.
destinationDirectoryNameTyp: System.String
Der Pfad zum Verzeichnis, in dem die extrahierten Dateien abgelegt werden sollen, angegeben als relativer oder absoluter Pfad. Ein relativer Pfad wird relativ zum aktuellen Arbeitsverzeichnis interpretiert.
entryNameEncodingTyp: System.Text.Encoding
Die Codierung, die beim Lesen oder Schreiben von Eintragsnamen in diesem Archiv verwendet werden soll. Geben Sie einen Wert für diesen Parameter nur an, wenn eine Codierung für die Interoperabilität mit ZIP-Archiv-Tools und -Bibliotheken erforderlich ist, die die UTF-8-Codierung für Eintragsnamen nicht unterstützen.

Einzelne Datei aus Archiv extrahieren

Neben der Möglichkeit ein komplettes ZIP-Archiv zu extrahieren ist es auch möglich einzelne Dateien aus dem Archiv zu extrahieren. Dafür könnte die Methode wie folgt aussehen:

Zunächst wird mit der GetEntry-Methode versucht den zu extrahierenden Eintrag innerhalb des Archivs zu ermitteln (Zeile 10). Wurde ein Eintrag gefunden wird überprüft, ob das Zielverzeichnis für den Extraktionsvorgang existiert (wenn nicht wird dieses angelegt). Schlussendlich wird in Zeile 20 der selektierte Eintrag extrahiert.

Innerhalb der Demo-Anwendung sieht das dann wie folgt aus:

ZipSampleApplication_02

Nachdem man über den Button „Open ZIP file“ ein ZIP-Archiv geöffent hat, werden die im ZIP-Archiv enthaltenen Dateien angezeigt. Mit einem Rechtsklick auf den zu extrahierenden Eintrag wird das Kontextmenü zum Extrahieren geöffnet. Bei Klick auf den Menüeintrag wird der Eintrag dann in den unter Output-Folder hinterlegten Ordner extrahiert.

Beispielanwendung

Hier nun die im Beitrag gezeigte Beispielanwendung. Diese Anwendung dient lediglich zu Demonstrationszwecken und hat somit keinen Anspruch auf Vollständigkeit.

[wpdm_file id=2]

Fork me on GitHub