Usando ZipFile en un sitio ASP.NET

En la oficina estamos haciendo una aplicación que nos permita hacer scripts en cascada basadas en cierto patrón para ahorro de tiempo de los analistas. Sin embargo para que sea más eficaz pensamos en una aplicación web para que sea accesible a todos desde la intranet.

Con esto surgió una complicación que sería engorroso y atenta contra la usabilidad del sitio el hecho de bajar “n” archivos de un mismo tipo. Por lo que se nos ocurrió empacar dichos scripts.

Mi colega se encarga de mandar dichos scripts en el servidor, y yo me encargué de la investigación de como empacar los archivos.

La información me la proporciono el sitio de Microsoft.

https://docs.microsoft.com/en-us/dotnet/api/system.io.compression.zipfile?view=netframework-4.7.2

El ejemplo que les muestro aquí muy sencillo, hicimos unas clases para manejo de archivos con las cuales creo 2 archivos de texto, que es equivalente a usar las clases System.IO.StreamWriter y System.IO.StreamReader.

Aquí la programación en un botón de tipo asp.

protected void Btn_generar_Click(object sender, EventArgs e)
{

//Vamos a crear archivos de texto
ServicesText miArchiText = new ServicesText(Server.MapPath(“~/Scripts/File1.txt”), “txt”);
StreamWriter sw = miArchiText.CreaArchivoEscritura();
miArchiText.EscribirLineadeTexto(sw, “Yo soy el archivo 1”);
miArchiText.CerrarArchivoEscritura(sw);
miArchiText = new ServicesText(Server.MapPath(“~/Scripts/File2.txt”), “txt”);
sw = miArchiText.CreaArchivoEscritura();
miArchiText.EscribirLineadeTexto(sw, “Yo soy el archivo 2”);
miArchiText.CerrarArchivoEscritura(sw);
sw.Dispose();
string pathorigen = Server.MapPath(“~/Scripts”);
string pathdest = Server.MapPath(“~/MiEmpacado.zip”);
ZipFile.CreateFromDirectory(pathorigen,pathdest);
Lbl_mensaje.Text = “Archivos generados”;

}

La magia esta en esas tres instrucciones, definir la carpeta donde están los archivos a ser empacados, definir la carpeta y nombre del archivo zip a ser creado, e invocar el método CreateFromDirectory de la clase ZipFile.

Solo un par de cosas: Por default no esta la referencia System.IO.Compression.FileSystem, sin esto no podemos accesar al objeto ZipFile. Esto se hace yendo a la carpeta de Referencias y con clic derecho damos agregar, ahora buscamos en la pestaña de la izquierda llamada Framework y buscamos y agregamos dicho ensamblado.

Luego agregamos el nuevo using.

using System.IO.Compression;

Algo que ahora deduzco es que forzosamente tenemos que usar una carpeta distinta a la que vamos a empacar pues el proceso la usa para empacar TODO lo que contiene en ella, de lo contrario nos dirá que el nuevo archivo que se esta generando (el zip) esta siendo usado por otro proceso, que es el empacado del archivo.

Hasta aquí este pequeño post.

Atte.

Profesor Miguel Araujo

Deja un comentario