Моя проблема в том, что как только ZipArchive
удаляется, он автоматически закрывается и удаляет файл MemoryStream
. Если я смотрю на поток до удаления ZipArchive
, информация не правильно сформирована zip.
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-файл, что-то не так. (Однако в окончательном коде я не хочу материализовать файл в коде обработки сбоев.)
using (var zipArchive = ZipFile.Open(@"wtf.zip", ZipArchiveMode.Create)
, результирующий физический zip-файл будет хорошо сформирован и значительно больше (50 КБ против 10 КБ), чем то, что я вижу в версии Stream. Таким образом, либо материал не сбрасывается изZipArchive
в поток, и/или поток не сбрасывается. Я пытался сбросить поток, но это не помогло. - person Csaba Toth   schedule 13.02.2014