2017-02-20 5 views
1

私はZipArchiveで作業しています。ほとんどの場合、私が見ている1つの問題は、ファイルをダウンロードしたときにWindowsのデフォルトアーカイブルーチンで開くことができないということです。 zipファイルをクリックしてすべてを抽出すると、抽出するエントリがないというエラーメッセージが表示されます。誰がなぜこれが起こっているのか知っていますか?それが価値があるのに対して、私は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()を処理しなかったと考えています.Open()は2番目の例/更新では、別のエントリを使用してステートメントを追加した場合、これは正しい動作をしているようです。 –

答えて

0

ZIPARCHIVEそれが配置されているときに、ストリームを求めるかZIPARCHIVEオブジェクトが配置される前に、それを使用するべきではありませんので、ストリームにいくつかの追加情報(eg.checksum)を追加します。

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"); 
} 
関連する問題