2017-02-20 17 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 (...)' do? – Dawnkeeper

+0

Я считаю, что проблема заключалась в том, что я явно не распоряжался записью. 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"); 
}