Trabajo con archivos ZIP en C# (.NET): guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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, Fastest o NoCompression;
  • 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:<

Recommendations