Trabajo con archivos ZIP en C# (.NET)
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, crear copias de seguridad o transferir datos a través de la red, la capacidad de comprimir y descomprimir archivos de manera eficiente es esencial para todo desarrollador de C#. En este artículo, analizaremos en detalle dos enfoques principales: el espacio de nombres integrado System.IO.Compression y la biblioteca de terceros SharpZipLib.
Herramientas integradas de .NET: System.IO.Compression
A partir de .NET Framework 4.5, la plataforma proporciona una API nativa para trabajar con archivos ZIP. Las clases principales se encuentran en el espacio de nombres System.IO.Compression.
Creación de un archivo ZIP
Para crear un archivo comprimido, se utiliza la clase ZipArchive junto con ZipFile:
using System.IO;using System.IO.Compression;
string sourceDirectory = @"C:\\Data\\Reports";string zipPath = @"C:\\Archives\\reports.zip";
if (File.Exists(zipPath)) File.Delete(zipPath);
ZipFile.CreateFromDirectory(sourceDirectory, zipPath);Console.WriteLine("Archivo comprimido creado: " + zipPath);Extracción de un archivo ZIP
La descompresión se realiza de manera similar, con el método ExtractToDirectory:
string extractPath = @"C:\\Data\\Extracted";ZipFile.ExtractToDirectory(zipPath, extractPath);Console.WriteLine("Archivo extraído en: " + extractPath);Trabajo con entradas individuales
Para un control más preciso, utilice ZipArchive directamente:
using (FileStream zipStream = new FileStream(zipPath, FileMode.Open))using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Read)){ foreach (ZipArchiveEntry entry in archive.Entries) { Console.WriteLine($"Archivo: {entry.FullName}, Tamaño: {entry.Length} bytes"); // Extraer un archivo específico entry.ExtractToFile(Path.Combine(extractPath, entry.FullName), true); }}Biblioteca SharpZipLib
SharpZipLib es una potente biblioteca de terceros de código abierto que ofrece funcionalidades avanzadas en comparación con las herramientas integradas. Soporta más formatos (GZip, BZip2, Tar) y proporciona un control más flexible sobre el proceso de compresión.
Instalación de SharpZipLib
Instale la biblioteca a través del Administrador de paquetes NuGet:
Install-Package SharpZipLibO mediante .NET CLI:
dotnet add package SharpZipLibCreación de un archivo ZIP con SharpZipLib
using ICSharpCode.SharpZipLib.Zip;using ICSharpCode.SharpZipLib.Core;
string outputZip = @"C:\\Archives\\backup.zip";string[] filesToZip = Directory.GetFiles(@"C:\\Data\\Files", "*.*", SearchOption.AllDirectories);
using (FileStream fsOut = File.Create(outputZip))using (ZipOutputStream zipStream = new ZipOutputStream(fsOut)){ zipStream.SetLevel(9); // Compresión máxima (0-9)
foreach (string filename in filesToZip) { FileInfo fi = new FileInfo(filename); string entryName = ZipEntry.CleanName(fi.Name); ZipEntry newEntry = new ZipEntry(entryName); newEntry.DateTime = fi.LastWriteTime; newEntry.Size = fi.Length;
zipStream.PutNextEntry(newEntry);
byte[] buffer = new byte[4096]; using (FileStream fsInput = File.OpenRead(filename)) { StreamUtils.Copy(fsInput, zipStream, buffer); } zipStream.CloseEntry(); }}Extracción de un archivo ZIP con SharpZipLib
string inputZip = @"C:\\Archives\\backup.zip";string outputDir = @"C:\\Data\\Restored";
using (FileStream fsIn = File.OpenRead(inputZip))using (ZipInputStream zipStream = new ZipInputStream(fsIn)){ ZipEntry entry; while ((entry = zipStream.GetNextEntry()) !=