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());
}
}
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.
ResponderEliminarEste espacio de nombre si esta disponible en .Net 2.0, de hecho fue una de las novedades de esta versión.
Eliminar