2017-02-20 4 views
1

저는 ZipArchive로 작업 중이며 주로 작동합니다. 파일을 다운로드 할 때 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()을 명시 적으로 처리하지 않았다고 믿습니다. 두 번째 예제/업데이트에 항목을 사용하여 다른 문을 추가하면이 동작이 올바른 동작을하는 것처럼 보입니다. –

답변

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"); 
}