2017-02-20 4 views
1

Ich arbeite mit ZipArchive und es funktioniert größtenteils, das einzige Problem, das ich sehe, ist, dass wenn ich die Datei herunterlad ich kann es nicht mit Windows-Standard-Archiv-Routinen öffnen. Wenn ich auf die Zip-Datei klicke und alle extrahiere, erhalte ich eine Fehlermeldung, die besagt, dass keine Einträge zum Extrahieren vorhanden sind. Wer weiß, warum das passiert? Für was es wert ist, kann ich die gleiche Datei mit 7zip öffnen und die Datei ganz gut extrahieren.ZipArchive erzeugt ungültigen ZIP-Eintrag

public virtual ActionResult GetZip() 
    { 
     var summary = GetBytes(); 
     var response = new MemoryStream(); 
     using (var stream = new MemoryStream()) 
     { 
      using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true)) 
      { 
       var entry = archive.CreateEntry("myfiletozip" + fileExt); 

       using (var writer = new BinaryWriter(entry.Open())) 
       { 
        writer.Write(summary, 0, summary.Length); 
       } 
       stream.Seek(0, SeekOrigin.Begin); 
       stream.CopyTo(response); 
      } 
     } 

     response.Seek(0, SeekOrigin.Begin); 

     return this.File(response, MediaTypeNames.Application.Zip, "myzipfilename.zip"); 
    } 

UPDATE:

diese gefunden SO Answer und meine Quelle geändert und es funktioniert .... und ich weiß immer noch nicht, warum.

 byte[] response; 
     using (var stream = new MemoryStream()) 
     { 
      using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true)) 
      { 
       var entry = archive.CreateEntry("myfiletozip" + fileExt, CompressionLevel.Optimal); 
       using (var entryStream = entry.Open()) 
       using (var fileToCompressStream = new MemoryStream(summary)) 
       { 
        fileToCompressStream.CopyTo(entryStream); 
       } 
      } 
      response = stream.ToArray(); 
     } 
+1

Was macht 'this.File (...)'? – Dawnkeeper

+0

Ich glaube, dass das Problem war, dass ich nicht explizit über den Eintrag verfügen.Öffnen() im zweiten Beispiel/Update, wenn eine andere Verwendung Anweisung für den Eintrag hinzugefügt und dies schien mir das richtige Verhalten zu geben. –

Antwort

0

ZipArchive fügen Sie einige zusätzliche Informationen (eg.checksum) mit dem Strom, wenn es angebracht ist, so sollten Sie den Strom oder verwenden Sie es nicht suchen, bevor ZipArchive Objekt angeordnet ist.

public virtual ActionResult GetZip() 
{ 
    var summary = GetBytes(); 
    var response = new MemoryStream(); 
    using (var stream = new MemoryStream()) 
    { 
     using (var archive = new ZipArchive(stream, ZipArchiveMode.Create, true)) 
     { 
      var entry = archive.CreateEntry("myfiletozip" + fileExt); 

      using (var writer = new BinaryWriter(entry.Open())) 
      { 
       writer.Write(summary, 0, summary.Length); 
      } 
     } 
     //Use stream after archive is disposed 
     stream.Seek(0, SeekOrigin.Begin); 
     stream.CopyTo(response); 
    } 

    response.Seek(0, SeekOrigin.Begin); 

    return this.File(response, MediaTypeNames.Application.Zip, "myzipfilename.zip"); 
} 
Verwandte Themen