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");
}


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow