C# 我应该如何将ZipArchive与内存流一起使用?

C# 我应该如何将ZipArchive与内存流一起使用?,c#,memorystream,ziparchive,C#,Memorystream,Ziparchive,我的问题是,只要处置了ZipArchive,它就会自动关闭并处置MemoryStream。如果在处理ZipArchive之前查看流,则信息的格式不正确 using (var compressStream = new MemoryStream()) { using (var zipArchive = new ZipArchive(compressStream, ZipArchiveMode.Create)) { // Adding a couple of entri

我的问题是,只要处置了
ZipArchive
,它就会自动关闭并处置
MemoryStream
。如果在处理
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文件打开,那么肯定是出了问题。(在最后的代码中,我不想在崩溃处理代码中具体化文件。)

我遇到了同样的问题,我注意到
ZipArchive
构造函数有一个可选参数,名为
leaveOpen
。文档说明:
True,在释放System.IO.Compression.ZipArchive对象后保持流打开;否则为false


这为我解决了问题。

看起来在writer.Write(navStackInfo)之后有一个额外的括号;这就关闭了zipArchive。@DavidN谢谢,这就在那里,因为在我的真实代码中有额外的空指针检查和其他内容,所以我简化了这个示例。顺便说一下,如果我使用(var zipArchive=ZipFile.Open(@“wtf.zip”,ZipArchiveMode.Create)说
,则生成的物理zip文件格式良好,而且要大得多(50KB对10KB)比我在流版本中看到的要多。因此,要么东西没有从
ZipArchive
流中冲出,要么流没有冲出。我尝试冲出流,但没有帮助。可能应该被视为dup,而且目前有一个更好的可接受答案。我将正确的答案修改为leaveOpen one也是。很高兴知道。我想这是一些新事物,或者我们都忽略了它。ZipArchive区域正在进行开发。感谢您让我们知道。现在.NET在GitHub上,我试图找到它,但还没有找到msdn上构造器过载文档的链接: