Neuigkeiten in der .NET-Klassenbibliothek,Teil 5: Erstellen von ZIP-Dateien

Der Dotnet-Doktor  –  0 Kommentare

Die Version 4.5 der .NET-Framework-Klassenbibliothek enthält 947 neue Klassen. Eine Artikelserie stellt zehn Neuerungen vor, die nicht die großen Bibliotheken betreffen und daher nicht so im Licht der Öffentlichkeit stehen. Nachdem zuletzt die LeaveOpen-Option vorgestellt wurde, geht es heute in Teil 5 um das Erstellen von ZIP-Dateien.

Im Namensraum System.IO.Compression (Assembly-DLLs System.IO.Compression.dll und System.IO.Compression.FileSystem.dll) gibt es in .NET 4.5 neue Klassen zur Nutzung von ZIP-Archivdateien: ZipFile, ZipFileExtensions, ZipArchiv, ZipArchiveEntry und ZipArchiveMode. Bisher gab es hier nur Klassen, die einen Stream per ZIP komprimiert oder entkomprimiert haben. Die Klassen in System.IO.Packaging waren speziell auf ZIP-Pakete ausgerichtet, die Microsoft in XPS und Microsoft Office verwendet.

Im einfachsten Fall wendet man die neue Klasse ZipFile zum Einpacken eines ganzen Verzeichnisses bzw. zum Entpacken in ein Verzeichnis an:

Console.WriteLine("Erstelle ZIP-Datei...");
ZipFile.CreateFromDirectory(@"w:\documents", @"w:\documents-Archiv.zip",
CompressionLevel.Optimal, true);
Console.WriteLine("Entpacke ZIP-Datei...");
ZipFile.ExtractToDirectory(@"w:\documents-Archiv.zip",
@"w:\documents-archiv");

Mehr Kontrolle über die einzupackenden und auszupackenden Dateien hat man über ein ZipArchive-Objekt, das man von ZipFile.Open() erhält, siehe folgendes Listing:

/// <summary>
/// Packen einer ZIP-Datei
/// </summary>
public static void RunZip()
{
string ZipDateiPfad = @"c";
Console.WriteLine("Erstelle ZIP-Datei " + ZipDateiPfad);
if (System.IO.File.Exists(ZipDateiPfad))
System.IO.File.Delete(ZipDateiPfad);

IEnumerable<string> files =
Directory.EnumerateFiles(@"w:\documents", "*.docx");
using (ZipArchive zipArchive =
ZipFile.Open(@ZipDateiPfad, ZipArchiveMode.Create))
{
foreach (string file in files)
{
var eintragName = Path.Combine("Dokumente",
Path.GetFileName(file));
zipArchive.CreateEntryFromFile(file, eintragName);
}
}
Console.WriteLine(files.Count() + " Dateien archiviert!");
}


/// <summary>
/// Entpacken einer ZIP-Datei
/// </summary>
public static void RunUnzip()
{
string ZipDateiPfad = @"w:\documents.zip";
Console.WriteLine("Entpacke ZIP-Datei " + ZipDateiPfad);

using (ZipArchive zipArchive =
ZipFile.Open(ZipDateiPfad, ZipArchiveMode.Read))
{
foreach (ZipArchiveEntry entry in zipArchive.Entries)
{
if (entry.Length < 10000)
{
using (Stream eingabe = entry.Open())
{
Console.WriteLine(entry.Name);
var ausgabe = File.Create(@"w:\documents\entpackt_"
+ entry.Name);
eingabe.CopyTo(ausgabe);
ausgabe.Close();
}
}
}
}
}