Travailler avec les archives ZIP en C# (.NET) : guide complet
Dans le développement moderne sur la plateforme .NET, la manipulation des archives est une tâche courante. Qu'il s'agisse de compresser des journaux, de décompresser des configurations ou de créer des sauvegardes, les outils intégrés System.IO.Compression permettent de le faire efficacement et sans bibliothèques tierces. Dans cet article, nous aborderons les opérations principales avec les archives ZIP en C#, notamment la compression, l'extraction, l'ajout de fichiers et le travail avec les flux.
Espaces de noms nécessaires
Pour travailler avec les archives dans .NET, deux espaces de noms principaux sont utilisés :
using System.IO;using System.IO.Compression;À partir de .NET Framework 4.5, la classe ZipFile est disponible dans l'assembly System.IO.Compression.FileSystem. Dans .NET Core / .NET 5+, elle fait partie de la bibliothèque de base.
Création d'une archive ZIP à partir de fichiers
La façon la plus simple de créer une archive est d'utiliser la méthode statique ZipFile.CreateFromDirectory. Elle prend le chemin du dossier, le chemin de l'archive et le niveau de compression.
string sourceFolder = @"C:\\Temp\\Documents";string zipPath = @"C:\\Temp\\backup.zip";
// Création de l'archive avec compression OptimalZipFile.CreateFromDirectory(sourceFolder, zipPath, CompressionLevel.Optimal, false);
Console.WriteLine($"Archive créée : {zipPath}");Paramètres :
- sourceFolder — le répertoire source ;
- zipPath — le chemin de la future archive ;
- CompressionLevel —
Optimal,FastestouNoCompression; - includeBaseDirectory — si
true, le dossier racine sera inclus dans l'archive.
Décompression d'une archive ZIP
L'extraction des fichiers s'effectue avec la méthode ZipFile.ExtractToDirectory :
string zipPath = @"C:\\Temp\\backup.zip";string extractPath = @"C:\\Temp\\Restored";
// Décompression avec remplacement des fichiers existantsZipFile.ExtractToDirectory(zipPath, extractPath, overwriteFiles: true);
Console.WriteLine("Archive décompressée.");Dans .NET 6+, le paramètre overwriteFiles permet de remplacer les fichiers sans lever d'exception.
Ajout de fichiers à une archive existante
La classe ZipArchive offre un contrôle total sur le contenu. Ouvrons l'archive en mode mise à jour et ajoutons un nouveau fichier :
string zipPath = @"C:\\Temp\\backup.zip";string newFile = @"C:\\TempewDocument.txt";
using (FileStream zipStream = new FileStream(zipPath, FileMode.Open, FileAccess.ReadWrite))using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Update)){ // Création d'une entrée dans l'archive ZipArchiveEntry entry = archive.CreateEntry("newDocument.txt");
using (StreamWriter writer = new StreamWriter(entry.Open())) { writer.Write("Ceci est le contenu du nouveau fichier."); }
Console.WriteLine($"Fichier {newFile} ajouté à l'archive.");}Important : lors de l'utilisation de ZipArchiveMode.Update, l'archive doit être ouverte en lecture et en écriture.
Lecture du contenu d'une archive sans décompression
Parfois, il suffit de voir quels fichiers se trouvent à l'intérieur. Pour cela, parcourons les entrées de l'archive :
string zipPath = @"C:\\Temp\\backup.zip";
using (FileStream zipStream = new FileStream(zipPath, FileMode.Open, FileAccess.Read))using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Read)){ foreach (ZipArchiveEntry entry in archive.Entries) { Console.WriteLine($"Fichier : {entry.FullName}, Taille : {entry.Length} octets"); }}La propriété FullName contient le chemin à l'intérieur de l'archive, y compris les sous-dossiers.
Travail avec les flux : compression et décompression en mémoire
Pour les scénarios où l'archive doit être transmise via le réseau ou stockée dans une base de données, il est pratique d'utiliser MemoryStream :