.NET Framework
Leer y escribir archivos zip
Buscar..
Introducción
La clase ZipFile vive en el espacio de nombres System.IO.Compression . Se puede utilizar para leer y escribir en archivos Zip.
Observaciones
También puede utilizar un MemoryStream en lugar de un FileStream.
Excepciones
Excepción | Condición |
---|---|
ArgumentException | La secuencia ya se ha cerrado, o las capacidades de la secuencia no coinciden con el modo (por ejemplo, tratando de escribir en una secuencia de solo lectura) |
ArgumentNullException | el flujo de entrada es nulo |
ArgumentOutOfRangeException | el modo tiene un valor inválido |
InvalidDataException | Ver lista abajo |
Cuando se lanza una InvalidDataException , puede tener 3 causas:
- El contenido del flujo no se puede interpretar como un archivo zip
- el modo es Actualizar y falta una entrada del archivo o está dañada y no se puede leer
- el modo es Actualizar y una entrada es demasiado grande para caber en la memoria
Toda la información ha sido tomada de esta página de MSDN.
Listado de contenidos ZIP
Este fragmento de código mostrará una lista de todos los nombres de archivos de un archivo zip. Los nombres de archivo son relativos a la raíz 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]}");
}
}
Extraer archivos de archivos ZIP
Extraer todos los archivos en un directorio es muy fácil:
using (FileStream fs = new FileStream("archive.zip", FileMode.Open))
using (ZipArchive archive = new ZipArchive(fs, ZipArchiveMode.Read))
{
archive.ExtractToDirectory(AppDomain.CurrentDomain.BaseDirectory);
}
Cuando el archivo ya exista, se lanzará una excepción System.IO.IOException .
Extraer archivos específicos:
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);
}
Cualquiera de estos métodos producirá el mismo resultado.
Actualizando un archivo ZIP
Para actualizar un archivo ZIP, el archivo debe abrirse con ZipArchiveMode.Update en su lugar.
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");
}
También existe la opción de escribir directamente en un archivo dentro del archivo:
var entry = archive.CreateEntry("createentry.txt");
using(var writer = new StreamWriter(entry.Open()))
{
writer.WriteLine("Test line");
}