.NET Framework
Lecture et écriture de fichiers Zip
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");
}