Comprimir y extraer archivos Zip

El espacio de nombres System.IO.Compression contiene los siguientes tipos para comprimir y descomprimir los archivos y las secuencias.
  • ZipFile 
  • ZipArchive 
  • ZipArchiveEntry 
  • DeflateStream 
  • GZipStream

Como comprimir un archivo .zip:


Utilizaremos la clase estática ZipFile para comprimir un archivo o una carpeta que contenga varios archivos.
Lo primero que debemos hacer luego de crear el proyecto es agregar una referencia al ensamblado System.IO.Compression.FileSystem, luego agregar el namespace System.IO.Compression .



La siguiente línea de código creara un archivo .zip comprimido, el método CreateFromDirectory hará este trabajo debemos indicarle como primer parámetro el directorio a comprimir, la ruta y nombre para guardarlo, el nivel de compresión y por ultimo true si se desea incluir el directorio raíz o false si solo deseamos incluir los archivos que contenga dicho directorio.

ZipFile.CreateFromDirectory("D:/Seguridad", "D:/seg.zip", CompressionLevel.Optimal, false);

Como extraer un archivo .zip:


Del mismo el método ExtractToDirectory extrae un archivo .zip en un directorio especificado.

Manipular un archivo .zip:


Puede que un archivo .zip contenga varios archivos dentro de él si deseamos extraer solo algunos de ellos podemos utilizar la clase ZipArchive para tener acceso al archivo zip y ZipArchiveEntry para inspeccionar individualmente cada archivo, el método ExtractToFile extrae un archivo individual.

Debemos agregar una referencia al ensamblado System.IO.Compression y el namespace System.IO 

Suponiendo que con el código anterior comprimimos una carpeta que contenía imágenes .jpg y archivos de texto .txt si deseamos comprimir solo los archivos de texto haríamos lo siguiente: 

using (ZipArchive archive = ZipFile.OpenRead("D:/seg.zip"))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        if (entry.FullName.EndsWith(".txt", StringComparison.OrdinalIgnoreCase))
        {
            entry.ExtractToFile(Path.Combine("D:/extract", entry.FullName));
        }
    }
}

También podemos agregar un archivo a la carpeta que ya antes comprimimos, seguimos con el mismo ejemplo, suponiendo que ahora quisiéramos agregar una imagen más a nuestro archivo comprimido, lo haremos como sigue:


using (FileStream zipToOpen = new FileStream(@"d:\seg.zip", FileMode.Open))
{
    using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
    {
        ZipArchiveEntry entry = archive.CreateEntry("nueva.jpg");
        File.OpenRead(@"d:\nueva.jpg").CopyTo(entry.Open());
    }
}

Comentarios

  1. Estuve revisando y el espacio de nombres System.IO.Compression está disponible en .Net 3.5 y 4. No he revisado si existe para .Net 2.0.

    ResponderEliminar
    Respuestas
    1. Este espacio de nombre si esta disponible en .Net 2.0, de hecho fue una de las novedades de esta versión.

      Eliminar

Publicar un comentario

Entradas populares de este blog

Conectar SQL Server con Java

Detección de rostros

Instalar OpenCV para Python en Windows