2016-04-21 19 views
2

Ich benutze ZipArchive, um einen gezippten Ordner für eine Liste von Dokumenten zu erstellen.ZipArchive Rückgabe leerer Ordner C#

Ich kann nicht herausfinden, warum, wenn ich meinen archivierten Ordner zurückgebe, ist es leer.

Kann jemand sehen, was ich hier falsch mache?

Mein Code ist wie folgt:

if (files.Count > 1) 
{ 
    var ms = new MemoryStream(); 
    var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, false); 
    foreach (var file in files) 
    { 
     var entry = zipArchive.CreateEntry(file.UploadFileName, CompressionLevel.Fastest); 
     using (var streamWriter = new StreamWriter(entry.Open())) 
     { 
      Stream strFile = new MemoryStream(file.UploadFileBytesStream); 
      streamWriter.Write(strFile); 
      strFile.CopyTo(ms); 
     } 
    } 
    return File(ms, System.Net.Mime.MediaTypeNames.Application.Zip, "FinancialActivityReports.zip"); 
} 
+0

wo speichern Sie es mit diesem Namen? "FinancialActivityReports.zip" –

+0

Es wird an den Browser zurückgegeben und vom Benutzer heruntergeladen. – Mark

Antwort

1

für das folgende Modell Unter der Annahme, file

public class FileModel { 
    public string UploadFileName { get; set; } 
    public byte[] UploadFileBytesStream { get; set; } 
} 

Die folgenden Helfer geschrieben wurde, den Strom der komprimierten Dateien erstellen

public static class FileModelCompression { 

    public static Stream Compress(this IEnumerable<FileModel> files) { 
     if (files.Any()) { 
      var ms = new MemoryStream(); 
      var archive = new ZipArchive(ms, ZipArchiveMode.Create, false); 
      foreach (var file in files) { 
       var entry = archive.add(file); 
      } 
      ms.Position = 0; 
      return ms; 
     } 
     return null; 
    } 

    private static ZipArchiveEntry add(this ZipArchive archive, FileModel file) { 
     var entry = archive.CreateEntry(file.UploadFileName, CompressionLevel.Fastest); 
     using (var stream = entry.Open()) { 
      stream.Write(file.UploadFileBytesStream, 0, file.UploadFileBytesStream.Length); 
      stream.Position = 0; 
      stream.Close(); 
     } 
     return entry; 
    } 
} 

Sie codieren, vorausgesetzt, dass files von 012 abgeleitet istwird dann zu diesem ändern ...

if (files.Count > 1) 
{ 
    var stream = files.Compress(); 
    return File(stream, System.Net.Mime.MediaTypeNames.Application.Zip, "FinancialActivityReports.zip"); 
}