2009-08-07 112 views

Respuesta

5

No estoy seguro de lo que quiere decir con no querer usar las herramientas de terceros, pero supongo que es que no quiere una interoperabilidad desagradable para programarlo a través de otra pieza de software.

recomiendo el uso de ICSharpCode SharpZipLib

Esto se puede agregar a su proyecto como un archivo DLL de referencia y es algo relativamente sencillo para la creación de archivos ZIP y leerlos.

+1

SharpZipLib es bueno (+1) pero puede hacerlo de forma nativa en .Net ahora - vea la respuesta de @Ruben Bartelink – Keith

+0

@Keith - solo si se ha movido a .Net 3.0+ – cjk

+0

No lo hizo excluir .NET 3, y es apenas tan grande como forzar un movimiento de .NET 1.1 a 2.0 - Aunque SharpZipLib es una buena biblioteca que es muy utilizada (inc por mí) –

0

Siempre puede llamar a un ejecutable de un tercero como 7-zip con una línea de comando apropiada usando la clase System.Diagnostics.Process. No hay interoperación de esa manera porque solo le pides al SO que inicie un binario.

1

DotNetZip es el camino a seguir (dotnetzip.codeplex.com) ... no pruebes la librería .NET Packaging ... demasiado difícil de usar y me molesta el [Content_Types] .xml que pone allí.

17

Con el lanzamiento de .NET Framework 4.5 esto es realmente mucho más fácil ahora con las actualizaciones a System.IO.Compression que agrega ZipFile class. Hay un buen walk-through on codeguru; Sin embargo, los fundamentos están en línea con el siguiente ejemplo:

using System.Collections.Generic; 
using System.IO; 
using System.IO.Compression; 
using System.IO.Compression.FileSystem; 

namespace ZipFileCreator 
{ 
    public static class ZipFileCreator 
    { 
     /// <summary> 
     /// Create a ZIP file of the files provided. 
     /// </summary> 
     /// <param name="fileName">The full path and name to store the ZIP file at.</param> 
     /// <param name="files">The list of files to be added.</param> 
     public static void CreateZipFile(string fileName, IEnumerable<string> files) 
     { 
      // Create and open a new ZIP file 
      var zip = ZipFile.Open(fileName, ZipArchiveMode.Create); 
      foreach (var file in files) 
      { 
       // Add the entry for each file 
       zip.CreateEntryFromFile(file, Path.GetFileName(file), CompressionLevel.Optimal); 
      } 
      // Dispose of the object when we are done 
      zip.Dispose(); 
     } 
    } 
} 

+1

¿Cómo hago esto al obtener los datos de los archivos (blob) de la base de datos? – Seth

+0

@Seth, probablemente necesites hacer algunas E/S. Deserializar el blob de vuelta a bytes, escribir los bytes en el archivo, luego pasar la ruta completa del archivo en este método como uno de los archivos en los archivos 'IEnumerable ' –

2

Bien se puede comprimir los archivos usando la función siguiente que ha de pasar sólo los bytes del archivo y esta función se zip los bytes del archivo pasado como parámetro y devuelve los bytes del archivo comprimido.

public static byte[] PackageDocsAsZip(byte[] fileBytesTobeZipped, string packageFileName) 
{ 
    try 
    { 
     string parentSourceLoc2Zip = @"C:\\\\UploadedDocs"\SG-ACA OCI Packages"; 
     if (Directory.Exists(parentSourceLoc2Zip) == false) 
     { 
      Directory.CreateDirectory(parentSourceLoc2Zip); 
     } 

     //if destination folder already exists then delete it 
     string sourceLoc2Zip = string.Format(@"{0}\{1}", parentSourceLoc2Zip, packageFileName); 
     if (Directory.Exists(sourceLoc2Zip) == true) 
     { 
      Directory.Delete(sourceLoc2Zip, true); 
     } 
     Directory.CreateDirectory(sourceLoc2Zip); 



      FilePath = string.Format(@"{0}\{1}", 
        sourceLoc2Zip, 
        "filename.extension");//e-g report.xlsx , report.docx according to exported file 

      File.WriteAllBytes(FilePath, fileBytesTobeZipped); 




     //if zip already exists then delete it 
     if (File.Exists(sourceLoc2Zip + ".zip")) 
     { 
      File.Delete(sourceLoc2Zip + ".zip"); 
     } 

     //now zip the source location 
     ZipFile.CreateFromDirectory(sourceLoc2Zip, sourceLoc2Zip + ".zip", System.IO.Compression.CompressionLevel.Optimal, true); 

     return File.ReadAllBytes(sourceLoc2Zip + ".zip"); 
    } 
    catch 
    { 
     throw; 
    } 
} 

Ahora bien, si desea exportar esta bytes ZIP creados para que el usuario descarga puede llamar a esta función utilizando siguientes líneas

Response.Clear(); 
    Response.AddHeader("content-disposition", "attachment; filename=Report.zip"); 
    Response.ContentType = "application/zip"; 
    Response.BinaryWrite(PackageDocsAsZip(fileBytesToBeExported ,"TemporaryFolderName")); 
    Response.End(); 
0

archivo zip simple con estructura plana:

using System.IO; 
using System.IO.Compression; 

private static void CreateZipFile(IEnumerable<FileInfo> files, string archiveName) 
{ 
    using (var stream = File.OpenWrite(archiveName)) 
    { 
     using (ZipArchive archive = new ZipArchive(stream, System.IO.Compression.ZipArchiveMode.Create)) 
     { 
      foreach (var item in files) 
      { 
       archive.CreateEntryFromFile(item.FullName, item.Name, CompressionLevel.Optimal);      
      } 
     } 
    } 
} 

Necesita agregar referencia a System.IO.Compression y System.IO.Compression.FileSystem

Cuestiones relacionadas