Trabajo con archivos ZIP en C# (.NET): guía completa
En el desarrollo moderno en la plataforma .NET, trabajar con archivos comprimidos es una de las tareas más comunes. Ya sea para empaquetar registros, descomprimir configuraciones o crear copias de seguridad, las herramientas integradas de System.IO.Compression permiten hacerlo de manera eficiente y sin bibliotecas externas. En este artículo analizaremos las operaciones principales con archivos ZIP en C#, incluyendo compresión, extracción, adición de archivos y trabajo con flujos.
Espacios de nombres necesarios
Para trabajar con archivos comprimidos en .NET se utilizan dos espacios de nombres principales:
using System.IO;using System.IO.Compression;A partir de .NET Framework 4.5, la clase ZipFile está disponible en el ensamblado System.IO.Compression.FileSystem. En .NET Core / .NET 5+ forma parte de la biblioteca base.
Creación de un archivo ZIP a partir de archivos
La forma más sencilla de crear un archivo comprimido es usar el método estático ZipFile.CreateFromDirectory. Este recibe la ruta de la carpeta, la ruta del archivo comprimido y el nivel de compresión.
string sourceFolder = @"C:\\Temp\\Documents";string zipPath = @"C:\\Temp\\backup.zip";
// Creamos el archivo comprimido con compresión OptimalZipFile.CreateFromDirectory(sourceFolder, zipPath, CompressionLevel.Optimal, false);
Console.WriteLine($"Archivo comprimido creado: {zipPath}");Parámetros:
- sourceFolder — directorio de origen;
- zipPath — ruta del futuro archivo comprimido;
- CompressionLevel —
Optimal,FastestoNoCompression; - includeBaseDirectory — si es
true, se incluirá la carpeta raíz en el archivo comprimido.
Descompresión de un archivo ZIP
La extracción de archivos se realiza con el método ZipFile.ExtractToDirectory:
string zipPath = @"C:\\Temp\\backup.zip";string extractPath = @"C:\\Temp\\Restored";
// Descomprimimos sobrescribiendo archivos existentesZipFile.ExtractToDirectory(zipPath, extractPath, overwriteFiles: true);
Console.WriteLine("Archivo comprimido descomprimido.");En .NET 6+ se agregó el parámetro overwriteFiles, que permite sobrescribir archivos sin lanzar excepciones.
Agregar archivos a un archivo comprimido existente
La clase ZipArchive ofrece control total sobre el contenido. Abrimos el archivo comprimido en modo de actualización y agregamos un nuevo archivo:
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)){ // Creamos una entrada en el archivo comprimido ZipArchiveEntry entry = archive.CreateEntry("newDocument.txt");
using (StreamWriter writer = new StreamWriter(entry.Open())) { writer.Write("Este es el contenido del nuevo archivo."); }
Console.WriteLine($"Archivo {newFile} agregado al archivo comprimido.");}Importante: al usar ZipArchiveMode.Update, el archivo comprimido debe estar abierto para lectura y escritura.
Leer el contenido de un archivo comprimido sin descomprimirlo
A veces solo necesitamos ver qué archivos contiene. Para ello, recorremos las entradas del archivo comprimido:
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($"Archivo: {entry.FullName}, Tamaño: {entry.Length} bytes"); }}La propiedad FullName contiene la ruta dentro del archivo comprimido, incluyendo subcarpetas.
Trabajo con flujos: compresión y descompresión en memoria
Para escenarios donde el archivo comprimido debe enviarse por red o guardarse en una base de datos, es conveniente usar MemoryStream:<