我正在尝试使用一个简单的演示文本文件创建一个 ZIP 存档,MemoryStream如下所示:
MemoryStream
using (var memoryStream = new MemoryStream()) using (var archive = new ZipArchive(memoryStream , ZipArchiveMode.Create)) { var demoFile = archive.CreateEntry("foo.txt"); using (var entryStream = demoFile.Open()) using (var streamWriter = new StreamWriter(entryStream)) { streamWriter.Write("Bar!"); } using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create)) { stream.CopyTo(fileStream); } }
如果我运行此代码,则会创建存档文件本身,但不会创建 foo.txt 。
但是,如果我MemoryStream直接将其替换为文件流,则会正确创建存档:
using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create)) using (var archive = new ZipArchive(fileStream, FileMode.Create)) { // ... }
是否可以在没有 的情况下使用 aMemoryStream创建 ZIP 存档FileStream?
FileStream
感谢[ZipArchive 创建了无效的 ZIP文件]),我得到了:
using (var memoryStream = new MemoryStream()) { using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { var demoFile = archive.CreateEntry("foo.txt"); using (var entryStream = demoFile.Open()) using (var streamWriter = new StreamWriter(entryStream)) { streamWriter.Write("Bar!"); } } using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create)) { memoryStream.Seek(0, SeekOrigin.Begin); memoryStream.CopyTo(fileStream); } }
这表明我们需要Dispose在ZipArchive使用它之前调用它,正如 Amir 所暗示的那样,这很可能是因为它会将最终字节(如校验和)写入使其完整的存档。但是为了不关闭流,以便在您需要true作为第三个参数传递给ZipArchive.
Dispose
ZipArchive
true