2014-02-12 3 views
7

Моя проблема заключается в том, что как только ZipArchive находится, он автоматически закрывает и удаляет MemoryStream. Если я посмотрю на поток до удаления ZipArchive, информация не будет хорошо сформирована zip.Как я могу использовать ZipArchive с потоками памяти?

using (var compressStream = new MemoryStream()) 
{ 
    using (var zipArchive = new ZipArchive(compressStream, ZipArchiveMode.Create)) 
    { 
     // Adding a couple of entries 
     string navStackInfo = Navigation.NavState.CurrentStackInfoLines(); 
     var navStackEntry = zipArchive.CreateEntry("NavStack.txt", CompressionLevel.NoCompression); 
     using (StreamWriter writer = new StreamWriter(navStackEntry.Open())) 
     { 
      writer.Write(navStackInfo); 
     } 
     var debugInfoEntry = zipArchive.CreateEntry("CallStack.txt", CompressionLevel.Optimal); 
     using (StreamWriter writer = new StreamWriter(debugInfoEntry.Open())) 
     { 
      // debugInfo.Details is a string too 
      writer.Write(debugInfo.Details); 
     } 
     // ... 
     // compressStream here is not well formed 
    } 
    // compressStream here is closed and disposed 
} 

Так как это должно работать? Может быть, единственная проблема в том, что она плохо сформирована? Я вижу заголовок «PK» в пределах файла (не только в начале) в начале каждой части входа. Я не уверен, хорошо это или нет. Конечно, если я сохраню поток в файл, я не могу его открыть в виде zip-файла, что-то не так. (В конечном коде я не хочу материализовать файл в коде обработки сбоев.)

+0

Похоже, у вас есть дополнительная скобка после писателя. Запишите (navStackInfo); который закрывает zipArchive. – DavidN

+0

@DavidN Спасибо, это было только что, потому что в моем реальном коде есть лишние проверки указателей и т. Д., Поэтому я упростил этот пример. –

+0

BTW, если я говорю 'using (var zipArchive = ZipFile.Open (@" wtf.zip ", ZipArchiveMode.Create)', полученный физический zip-файл является хорошо сформированным и значительно большим (50 КБ против 10 КБ), чем то, что я см. в потоковой версии.Так что либо материал не вымывается из 'ZipArchive' в поток и/или поток не сбрасывается. Я попытался очистить поток, но это не помогло. –

ответ

8

Я просто столкнулся с той же проблемой, и я заметил, что существует необязательный параметр для конструктора ZipArchive с именем leaveOpen. Документация говорит: True to leave the stream open after the System.IO.Compression.ZipArchive object is disposed; otherwise, false.

Это решило проблему для меня.

+0

Полезно знать. Думаю, это какая-то новая вещь или все из нас упустили это. В этом районе ZipArchive продолжалось развитие. Спасибо, что сообщили нам. –

+0

Теперь, когда .NET на GitHub, я попытался его найти, но пока не удался https://github.com/dotnet/coreclr/search? q = ziparchive https: // gi thub.com/dotnet/corefx/search?q=ziparchive –

+0

Ссылка на конструктор перегрузки doc на msdn: https://msdn.microsoft.com/en-us/library/hh137431(v=vs.110).aspx –

 Смежные вопросы

  • Нет связанных вопросов^_^