2017-02-20 66 views
1

我正在使用ZipArchive,它主要工作,我看到的一個問題是,當文件下載我無法打開它與Windows默認歸檔例程。如果我單擊壓縮文件並提取所有內容,我會收到一條錯誤消息,指出沒有要提取的條目。任何人都知道這是爲什麼發生?對於它的價值,我可以用7zip打開相同的文件,並提取文件就好了。ZipArchive創建無效的ZIP條目

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:

發現這個SO Answer和修改我的源代碼和它的工作....我仍然不知道爲什麼。

 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

'this.File(...)'做了什麼? – Dawnkeeper

+0

我認爲問題在於我沒有明確地處理entry.Open()在第二個示例/ update中,如果爲條目添加了另一個using語句,這似乎給了我正確的行爲。 –

回答

0

ZipArchive添加一些額外的信息(eg.checksum)流中它被設置時,所以你不應該尋求流或使用ZipArchive對象設置之前。

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"); 
} 
相關問題