Моя проблема заключается в том, что как только 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-файла, что-то не так. (В конечном коде я не хочу материализовать файл в коде обработки сбоев.)
Похоже, у вас есть дополнительная скобка после писателя. Запишите (navStackInfo); который закрывает zipArchive. – DavidN
@DavidN Спасибо, это было только что, потому что в моем реальном коде есть лишние проверки указателей и т. Д., Поэтому я упростил этот пример. –
BTW, если я говорю 'using (var zipArchive = ZipFile.Open (@" wtf.zip ", ZipArchiveMode.Create)', полученный физический zip-файл является хорошо сформированным и значительно большим (50 КБ против 10 КБ), чем то, что я см. в потоковой версии.Так что либо материал не вымывается из 'ZipArchive' в поток и/или поток не сбрасывается. Я попытался очистить поток, но это не помогло. –