2017-02-20 67 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"); 
} 
相关问题