Zoeken…


Invoering

De ZipFile- klasse leeft in de naamruimte System.IO.Compression . Het kan worden gebruikt om te lezen van en te schrijven naar Zip-bestanden.

Opmerkingen

  • U kunt ook een MemoryStream gebruiken in plaats van een FileStream.

  • Uitzonderingen

Uitzondering Staat
ArgumentException De stream is al gesloten of de mogelijkheden van de stream komen niet overeen met de modus (bijvoorbeeld: proberen te schrijven naar een alleen-lezen stream)
ArgumentNullException invoerstroom null
ArgumentOutOfRangeException modus heeft een ongeldige waarde
InvalidDataException Zie onderstaande lijst

Wanneer een InvalidDataException wordt gegenereerd, kan dit 3 oorzaken hebben:

  • De inhoud van de stream kon niet worden geïnterpreteerd als een zip-archief
  • modus is Update en een vermelding ontbreekt in het archief of is beschadigd en kan niet worden gelezen
  • modus is Update en een invoer is te groot om in het geheugen te passen

Alle informatie is afkomstig van deze MSDN-pagina

Vermelding ZIP-inhoud

In dit fragment worden alle bestandsnamen van een zip-archief weergegeven. De bestandsnamen zijn relatief ten opzichte van de zip root.

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

Bestanden uitpakken uit ZIP-bestanden

Het uitpakken van alle bestanden in een map is heel eenvoudig:

using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
    archive.ExtractToDirectory(AppDomain.CurrentDomain.BaseDirectory);
}

Wanneer het bestand al bestaat, wordt een System.IO.IO-uitzondering gegenereerd.

Specifieke bestanden uitpakken:

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

Elk van deze methoden zal hetzelfde resultaat opleveren.

Een ZIP-bestand bijwerken

Om een ZIP-bestand bij te werken, moet het bestand in plaats daarvan worden geopend met ZipArchiveMode.Update.

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

Er is ook de optie om rechtstreeks naar een bestand in het archief te schrijven:

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
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow