【发布时间】:2014-02-12 19:33:08
【问题描述】:
我的问题是,一旦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 文件打开,那就是有问题。 (不过,在最终代码中,我不想在崩溃处理代码中具体化文件。)
【问题讨论】:
-
看起来你在 writer.Write(navStackInfo); 后面多了一个括号关闭 zipArchive。
-
@DavidN 谢谢,就在那里,因为在我的真实代码中有额外的空指针检查和东西,所以我简化了这个例子。
-
顺便说一句,如果我说
using (var zipArchive = ZipFile.Open(@"wtf.zip", ZipArchiveMode.Create),生成的物理 zip 文件格式正确,并且比我在 Stream 版本中看到的要大得多(50KB 对 10KB)。所以要么这些东西没有从ZipArchive刷新到流中和/或流没有被刷新。我试图刷新流,但没有帮助。 -
也许应该被认为是 stackoverflow.com/q/12347775/1178314 的重复,而且目前有一个更好接受的答案。
-
我这里的正确答案也修改为 leaveOpen 一个。
标签: c# memorystream ziparchive