.NET Framework
Zip-Dateien lesen und schreiben
Suche…
Einführung
Die ZipFile- Klasse befindet sich im Namespace System.IO.Compression . Es kann zum Lesen und Schreiben von Zip-Dateien verwendet werden.
Bemerkungen
Sie können auch einen MemoryStream anstelle eines FileStream verwenden.
Ausnahmen
Ausnahme | Bedingung |
---|---|
ArgumentException | Der Stream wurde bereits geschlossen oder die Fähigkeiten des Streams stimmen nicht mit dem Modus überein (zB: Versuch, in einen Read-Only-Stream zu schreiben) |
ArgumentNullException | Eingabestrom ist null |
ArgumentOutOfRangeException | Modus hat einen ungültigen Wert |
InvalidDataException | Siehe nachstehende Liste |
Wenn eine InvalidDataException ausgelöst wird, kann dies drei Ursachen haben:
- Der Inhalt des Streams konnte nicht als ZIP-Archiv interpretiert werden
- Modus ist Update und ein Eintrag fehlt im Archiv oder ist beschädigt und kann nicht gelesen werden
- Modus ist Update und ein Eintrag ist zu groß, um in den Speicher zu passen
Alle Informationen wurden dieser MSDN-Seite entnommen
ZIP-Inhalt auflisten
Dieses Snippet listet alle Dateinamen eines ZIP-Archivs auf. Die Dateinamen sind relativ zur Zip-Wurzel.
using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
for (int i = 0; i < archive.Entries.Count; i++)
{
Console.WriteLine($"{i}: {archive.Entries[i]}");
}
}
Extrahieren von Dateien aus ZIP-Dateien
Das Extrahieren aller Dateien in ein Verzeichnis ist sehr einfach:
using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
archive.ExtractToDirectory(AppDomain.CurrentDomain.BaseDirectory);
}
Wenn die Datei bereits vorhanden ist, wird eine System.IO.IOException ausgelöst.
Extrahieren bestimmter Dateien:
using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
// Get a root entry file
archive.GetEntry("test.txt").ExtractToFile("test_extracted_getentries.txt", true);
// Enter a path if you want to extract files from a subdirectory
archive.GetEntry("sub/subtest.txt").ExtractToFile("test_sub.txt", true);
// You can also use the Entries property to find files
archive.Entries.FirstOrDefault(f => f.Name == "test.txt")?.ExtractToFile("test_extracted_linq.txt", true);
// This will throw a System.ArgumentNullException because the file cannot be found
archive.GetEntry("nonexistingfile.txt").ExtractToFile("fail.txt", true);
}
Jede dieser Methoden führt zum gleichen Ergebnis.
ZIP-Datei aktualisieren
Um eine ZIP-Datei zu aktualisieren, muss die Datei stattdessen mit ZipArchiveMode.Update geöffnet werden.
using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Update))
{
// Add file to root
archive.CreateEntryFromFile("test.txt", "test.txt");
// Add file to subfolder
archive.CreateEntryFromFile("test.txt", "symbols/test.txt");
}
Es besteht auch die Möglichkeit, direkt in eine Datei im Archiv zu schreiben:
var entry = archive.CreateEntry("createentry.txt");
using(var writer = new StreamWriter(entry.Open()))
{
writer.WriteLine("Test line");
}