Arbeiten mit ZIP-Archiven in C# (.NET): vollständige Anleitung
In der modernen Entwicklung auf der .NET-Plattform ist die Arbeit mit Archiven eine häufige Aufgabe. Ob es um das Packen von Logs, das Entpacken von Konfigurationen oder das Erstellen von Backups geht – die integrierten Mittel System.IO.Compression ermöglichen dies effizient und ohne externe Bibliotheken. In diesem Artikel behandeln wir die grundlegenden Operationen mit ZIP-Archiven in C#, einschließlich Komprimierung, Extraktion, Hinzufügen von Dateien und Arbeit mit Streams.
Erforderliche Namespaces
Für die Arbeit mit Archiven in .NET werden zwei Haupt-Namespaces verwendet:
using System.IO;using System.IO.Compression;Ab .NET Framework 4.5 ist die Klasse ZipFile in der Assembly System.IO.Compression.FileSystem verfügbar. In .NET Core / .NET 5+ ist sie in der Basisbibliothek enthalten.
Erstellen eines ZIP-Archivs aus Dateien
Der einfachste Weg, ein Archiv zu erstellen, ist die Verwendung der statischen Methode ZipFile.CreateFromDirectory. Sie akzeptiert den Pfad zum Ordner, den Pfad zum Archiv und die Komprimierungsstufe.
string sourceFolder = @"C:\\Temp\\Documents";string zipPath = @"C:\\Temp\\backup.zip";
// Archiv mit Optimal-Komprimierung erstellenZipFile.CreateFromDirectory(sourceFolder, zipPath, CompressionLevel.Optimal, false);
Console.WriteLine($"Archiv erstellt: {zipPath}");Parameter:
- sourceFolder — das Quellverzeichnis;
- zipPath — der Pfad zum zukünftigen Archiv;
- CompressionLevel —
Optimal,FastestoderNoCompression; - includeBaseDirectory — wenn
true, wird ein Stammordner im Archiv enthalten sein.
Entpacken eines ZIP-Archivs
Das Extrahieren von Dateien erfolgt mit der Methode ZipFile.ExtractToDirectory:
string zipPath = @"C:\\Temp\\backup.zip";string extractPath = @"C:\\Temp\\Restored";
// Entpacken mit Überschreiben vorhandener DateienZipFile.ExtractToDirectory(zipPath, extractPath, overwriteFiles: true);
Console.WriteLine("Archiv entpackt.");In .NET 6+ gibt es den Parameter overwriteFiles, der das Überschreiben von Dateien ohne Ausnahme ermöglicht.
Hinzufügen von Dateien zu einem vorhandenen Archiv
Die Klasse ZipArchive bietet vollständige Kontrolle über den Inhalt. Öffnen wir das Archiv im Aktualisierungsmodus und fügen eine neue Datei hinzu:
string zipPath = @"C:\\Temp\\backup.zip";string newFile = @"C:\\TempewDocument.txt";
using (FileStream zipStream = new FileStream(zipPath, FileMode.Open, FileAccess.ReadWrite))using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Update)){ // Eintrag im Archiv erstellen ZipArchiveEntry entry = archive.CreateEntry("newDocument.txt");
using (StreamWriter writer = new StreamWriter(entry.Open())) { writer.Write("Dies ist der Inhalt der neuen Datei."); }
Console.WriteLine($"Datei {newFile} zum Archiv hinzugefügt.");}Wichtig: Bei Verwendung von ZipArchiveMode.Update muss das Archiv zum Lesen und Schreiben geöffnet sein.
Lesen des Archivinhalts ohne Entpacken
Manchmal möchte man nur sehen, welche Dateien sich darin befinden. Dazu durchlaufen wir die Einträge des Archivs:
string zipPath = @"C:\\Temp\\backup.zip";
using (FileStream zipStream = new FileStream(zipPath, FileMode.Open, FileAccess.Read))using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Read)){ foreach (ZipArchiveEntry entry in archive.Entries) { Console.WriteLine($"Datei: {entry.FullName}, Größe: {entry.Length} Bytes"); }}Die Eigenschaft FullName enthält den Pfad innerhalb des Archivs, einschließlich Unterordner.
Arbeiten mit Streams: Komprimierung und Entpacken im Speicher
Für Szenarien, in denen das Archiv über das Netzwerk übertragen oder in einer Datenbank gespeichert werden soll, ist die Verwendung von MemoryStream praktisch:<
Auch in der Bibliothek
Arbeiten mit Excel in Java: Apache POI und Alternativen
Caching in Swift (iOS/macOS): Redis, NSCache und Core Data
WebSocket-Bibliotheken für Swift: Starscream und URLSessionWebSocketTask
Arbeiten mit CSV in PHP: Bibliothek PhpSpreadsheet