Recherche…


Introduction

La classe ZipFile réside dans l'espace de noms System.IO.Compression . Il peut être utilisé pour lire et écrire dans des fichiers Zip.

Remarques

  • Vous pouvez également utiliser un MemoryStream au lieu d'un FileStream.

  • Des exceptions

Exception Condition
ArgumentException Le flux a déjà été fermé ou les capacités du flux ne correspondent pas au mode (par exemple: essayer d'écrire dans un flux en lecture seule)
ArgumentNullException le flux d' entrée est nul
ArgumentOutOfRangeException le mode a une valeur non valide
InvalidDataException Voir liste ci-dessous

Lorsqu'une InvalidDataException est lancée, elle peut avoir trois causes:

  • Le contenu du flux ne peut pas être interprété comme une archive zip
  • le mode est Mise à jour et une entrée est absente de l'archive ou est corrompue et ne peut pas être lue
  • le mode est Mise à jour et une entrée est trop grande pour tenir dans la mémoire

Toutes les informations ont été extraites de cette page MSDN

Liste des contenus ZIP

Cet extrait listera tous les noms de fichiers d’une archive zip. Les noms de fichiers sont relatifs à la racine zip.

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

Extraction de fichiers à partir de fichiers ZIP

Extraire tous les fichiers dans un répertoire est très simple:

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

Lorsque le fichier existe déjà, une exception System.IO.IOException sera lancée.

Extraire des fichiers spécifiques:

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

Chacune de ces méthodes produira le même résultat.

Mise à jour d'un fichier ZIP

Pour mettre à jour un fichier ZIP, le fichier doit être ouvert avec ZipArchiveMode.Update à la place.

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

Il y a aussi la possibilité d'écrire directement dans un fichier dans l'archive:

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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow