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");
}


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow