2009-08-07 2 views
28

Ich zippen gerne mehrere Dateien, die dynamisch in meiner Webanwendung erstellt werden. Diese Dateien sollten gezippt werden. Aus diesem Grund möchte ich keine Tools von Drittanbietern verwenden. genau wie .net api in C#Wie zip mehrere Dateien mit nur. NET-API in C#

Antwort

5

Ich bin nicht sicher, was Sie meinen, indem Sie nicht wollen, dritte Partei Werkzeuge zu verwenden, aber ich nehme an, dass Sie nicht wollen, dass einige böse Interop programmatisch durch ein anderes Stück tun von Software.

Ich empfehle ICSharpCode SharpZipLib

Verwendung Dies kann als Referenz DLL zu einem Projekt hinzugefügt werden und ist recht unkompliziert ZIP-Dateien zum Erstellen und sie zu lesen.

+1

SharpZipLib ist gut (+1), aber Sie können es nativ in. Net jetzt tun - siehe @Ruben Bartelinks Antwort – Keith

+0

@Keith - nur wenn Sie auf .Net 3.0 + – cjk

+0

Er zog nicht schließen Sie .NET 3 aus, und es ist kaum so groß wie das Erzwingen einer Bewegung von .NET 1.1 zu 2.0 - Obwohl SharpZipLib eine gute Bibliothek ist, die stark benutzt wird (inc von mir) –

0

Sie könnten immer eine ausführbare Datei von Drittanbietern wie 7-zip mit einer geeigneten Befehlszeile mithilfe der System.Diagnostics.Process-Klasse aufrufen. Es gibt keine Interop auf diese Weise, weil Sie nur das Betriebssystem bitten, eine Binärdatei zu starten.

1

DotNetZip ist der Weg zu gehen (dotnetzip.codeplex.com) ... nicht versuchen, die .NET-Packaging-Bibliothek .. zu schwer zu bedienen und die [Content_Types] .xml, dass es dort stört mich.

17

Mit der Veröffentlichung von .NET Framework 4.5 ist dies jetzt viel einfacher mit den Updates zu System.IO.Compression, die die ZipFile class hinzufügt. Es gibt eine gute walk-through on codeguru; jedoch sind die Grundlagen im Einklang mit dem folgenden Beispiel:

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

Wie mache ich das, wenn ich die Dateien (Blobs) von der Datenbank bekomme? – Seth

+0

@Seth würden Sie wahrscheinlich einige I/O tun müssen. Deserialisieren Sie das Blob zurück in Bytes, schreiben Sie die Bytes in die Datei und übergeben Sie dann den vollständigen Dateipfad in diese Methode als eine der Dateien in 'IEnumerable files' –

2

Nun Sie die Dateien folgende Funktion zip können Sie müssen nur die Datei Bytes übergeben und diese Funktion wird die Datei Bytes übergeben als Parameter zip und gebe die gezippten Dateibytes zurück.

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; 
    } 
} 

Nun, wenn Sie dieses Zip-Bytes für Benutzer erstellt exportieren mögen Sie herunterladen können diese Funktion mit folgenden Zeilen

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

einfache Zip-Datei mit flacher Struktur:

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);      
      } 
     } 
    } 
} 

Sie müssen einen Verweis auf System.IO.Compression und System.IO.Compression.FileSystem hinzufügen.