Zip-Archive mit .NET generieren–Teil 1

Eine Aufgabe, welche jedem Softwareentwickler im Laufe der Entwicklung unterkommt, ist die Generierung von Dokumenten – hierfür habe ich bereits itextsharp für PDF vorgestellt – und das Packen/Entpacken von Dokumenten in ein ZIP-Archiv. Viele Anwendungen verwenden das ZIP-Format um verschiedene Elemente in eine Datei zu kapseln und dem Benutzer dadurch einfach zugänglich zu machen.

Für diese Samples verwenden wir die DotNetZip Library, welche auf CodePlex verfügbar ist (https://dotnetzip.codeplex.com/). Neben der DotNetZip Library gibt es noch eine Handvoll anderer Libraries aber in diesen Sample wollen wir uns auf die DotNetZip Library konzentrieren.

Zu Beginn ist es wichtig das wir einen Dateinamen festlegen:

private const string FILENAME = @"C:\b\CodeFestSample.zip";

Danach kann man das ZIP-Archiv erstellen. Hierfür erstellen wir eine neue Instanz der Klasse “ZipFile” und setzen die Komprimierung auf die höchste Stufe. Für schnelles Packen/Entpacken sollte ein niedriger Level gewählt werden. Die DotNetZip Library hat eine Funktion “AddDirectory” welche ein gesamtes Verzeichnis verzippen kann.

 private static void CreateZipFile()
{
    using (ZipFile newZipFile = new ZipFile(FILENAME)
    {
        CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression
    })
    {
        newZipFile.AddDirectory(@"C:\b\FilesToZip");
        newZipFile.Save();
    }
}

 

Dadurch wird das Verzeichnis in das Root-Verzeichnis des Zip-Archives inkludiert. Der Nachteil ist jedoch, das dies bei größeren Dateien unter Umständen sehr unübersichtlich werden kann. Daher empfiehlt es sich, den Methodenaufruf mit einem Pfad als zweiten Parameter zu versehen.

 newZipFile.AddDirectory(@"C:\b\FilesToZip", "SomeDir");

Somit ist das Verzeichnis in einen Sub-Folder gekapselt und sieht bereits wesentlich besser aus.

image

Will man eine vorhandene ZIP-Datei erweitern –sprich neue Dateien hinzufügen – so öffnet man die Datei mit “ZipFile.Read”. Die Methode “AddFile” fügt eine einzelne Datei hinzu.

 private static void AddFilesToDir()
{
    using (var file = ZipFile.Read(FILENAME))
    {
        file.AddFile(@"C:\b\TestPage.html");
        file.Save();
    }
}

image

Sieht man sich die Datei nun an, bemerkt man das ein neuer Ordner namens “b” erschienen ist. Dies wird richtig komplex wenn man eine Datei aus dem Ordner “C:\blub\oh\mein\gott\ist\das\ein\ur\langer\ordner\mit\vielen\dummen\unwichtigen\langen\sub\ordnern\die\eigentlich\gar\nicht\notwendig\sind”

Auch hier würde der Pfad erhalten bleiben. Da empfiehlt es sich, einen Subordner Typ festzulegen. Dies funktioniert ganz einfach indem man diesen als zweiten Parameter spezifiziert.

 file.AddFile(@"C:\b\TestPage.html", "/");