net example descomprimir asp.net zip

example - ¿Cómo crear y rellenar un archivo ZIP con ASP.NET?



ziparchive c# (8)

¿Es necesario empaquetar dinámicamente algunos archivos en un .zip para crear un paquete SCORM? ¿Alguien sabe cómo se puede hacer esto usando código? ¿Es posible construir la estructura de la carpeta dinámicamente dentro del .zip también?


Capaz de hacer esto usando DotNetZip. Puede descargarlo desde el gestor de paquetes de Visual Studio Nuget o directamente a través de DotnetZip . a continuación, intente código debajo,

/// <summary> /// Generate zip file and save it into given location /// </summary> /// <param name="directoryPath"></param> public void CreateZipFile(string directoryPath ) { //Select Files from given directory List<string> directoryFileNames = Directory.GetFiles(directoryPath).ToList(); using (ZipFile zip = new ZipFile()) { zip.AddFiles(directoryFileNames, ""); //Generate zip file folder into loation zip.Save("C://Logs//ReportsMyZipFile.zip"); } }

Si desea descargar el archivo en el cliente, utilice el siguiente código.

/// <summary> /// Generate zip file and download into client /// </summary> /// <param name="directoryPath"></param> /// <param name="respnse"></param> public void CreateZipFile(HttpResponse respnse,string directoryPath ) { //Select Files from given directory List<string> directoryFileNames = Directory.GetFiles(directoryPath).ToList(); respnse.Clear(); respnse.BufferOutput = false; respnse.ContentType = "application/zip"; respnse.AddHeader("content-disposition", "attachment; filename=MyFiles.zip"); using (ZipFile zip = new ZipFile()) { zip.CompressionLevel = CompressionLevel.None; zip.AddFiles(directoryFileNames, ""); zip.Save(respnse.OutputStream); } respnse.flush(); }



He utilizado un componente gratuito de chilkat para esto: http://www.chilkatsoft.com/zip-dotnet.asp . Hace prácticamente todo lo que he necesitado, pero no estoy seguro de cómo construir dinámicamente la estructura de archivos.


La creación del archivo ZIP "sobre la marcha" se haría usando nuestro componente Rebex ZIP .

El siguiente ejemplo lo describe completamente, incluida la creación de una subcarpeta:

// prepare MemoryStream to create ZIP archive within using (MemoryStream ms = new MemoryStream()) { // create new ZIP archive within prepared MemoryStream using (ZipArchive zip = new ZipArchive(ms)) { // add some files to ZIP archive zip.Add(@"c:/temp/testfile.txt"); zip.Add(@"c:/temp/innerfile.txt", @"/subfolder"); // clear response stream and set the response header and content type Response.Clear(); Response.ContentType = "application/zip"; Response.AddHeader("content-disposition", "filename=sample.zip"); // write content of the MemoryStream (created ZIP archive) to the response stream ms.WriteTo(Response.OutputStream); } } // close the current HTTP response and stop executing this page HttpContext.Current.ApplicationInstance.CompleteRequest();



Si está utilizando .NET Framework 4.5 o más reciente, puede evitar las bibliotecas de terceros y usar la clase nativa System.IO.Compression.ZipArchive .

Aquí hay un ejemplo de código rápido que utiliza un MemoryStream y un par de matrices de bytes que representan dos archivos:

byte[] file1 = GetFile1ByteArray(); byte[] file2 = GetFile2ByteArray(); using (MemoryStream ms = new MemoryStream()) { using (var archive = new ZipArchive(ms, ZipArchiveMode.Create, true)) { var zipArchiveEntry = archive.CreateEntry("file1.txt", CompressionLevel.Fastest); using (var zipStream = zipArchiveEntry.Open()) zipStream.Write(file1, 0, file1.Length); zipArchiveEntry = archive.CreateEntry("file2.txt", CompressionLevel.Fastest); using (var zipStream = zipArchiveEntry.Open()) zipStream.Write(file2, 0, file2.Length); } return File(ms.ToArray(), "application/zip", "Archive.zip"); }

Puede usarlo dentro de un controlador MVC que devuelve un ActionResult : alternativamente, si necesita crear físicamente el archivo zip, puede conservar el MemoryStream en el disco o reemplazarlo por completo con un FileStream .

Para obtener más información sobre este tema, también puede leer esta publicación en mi blog.


Ya no tienes que usar una biblioteca externa. System.IO.Packaging tiene clases que se pueden usar para colocar contenido en un archivo zip. Sin embargo, no es simple. Aquí hay una publicación de blog con un ejemplo (está al final; cava para obtenerla).

El enlace no es estable, así que aquí está el ejemplo que Jon proporcionó en la publicación.

using System; using System.IO; using System.IO.Packaging; namespace ZipSample { class Program { static void Main(string[] args) { AddFileToZip("Output.zip", @"C:/Windows/Notepad.exe"); AddFileToZip("Output.zip", @"C:/Windows/System32/Calc.exe"); } private const long BUFFER_SIZE = 4096; private static void AddFileToZip(string zipFilename, string fileToAdd) { using (Package zip = System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate)) { string destFilename = ".//" + Path.GetFileName(fileToAdd); Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative)); if (zip.PartExists(uri)) { zip.DeletePart(uri); } PackagePart part = zip.CreatePart(uri, "",CompressionOption.Normal); using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read)) { using (Stream dest = part.GetStream()) { CopyStream(fileStream, dest); } } } } private static void CopyStream(System.IO.FileStream inputStream, System.IO.Stream outputStream) { long bufferSize = inputStream.Length < BUFFER_SIZE ? inputStream.Length : BUFFER_SIZE; byte[] buffer = new byte[bufferSize]; int bytesRead = 0; long bytesWritten = 0; while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) != 0) { outputStream.Write(buffer, 0, bytesRead); bytesWritten += bytesRead; } } } }


DotNetZip es bueno para esto. Ejemplo de trabajo

Puede escribir el zip directamente en el Response.OutputStream. El código se ve así:

Response.Clear(); Response.BufferOutput = false; // for large files... System.Web.HttpContext c= System.Web.HttpContext.Current; String ReadmeText= "Hello!/n/nThis is a README..." + DateTime.Now.ToString("G"); string archiveName= String.Format("archive-{0}.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss")); Response.ContentType = "application/zip"; Response.AddHeader("content-disposition", "filename=" + archiveName); using (ZipFile zip = new ZipFile()) { // filesToInclude is an IEnumerable<String>, like String[] or List<String> zip.AddFiles(filesToInclude, "files"); // Add a file from a string zip.AddEntry("Readme.txt", "", ReadmeText); zip.Save(Response.OutputStream); } // Response.End(); // no! See http://.com/questions/1087777 Response.Close();

DotNetZip es gratis.