使用 MemoryStream 在内存中创建 ZIP 存档
尝试使用 MemoryStream 在内存中创建 ZIP 存档时,用户可能会遇到以下情况:存档文件已生成,但缺少预期的内容文件。用 FileStream 替换 MemoryStream 可以解决该问题。但是,在不借助 FileStream 的情况下利用 MemoryStream 创建 ZIP 存档是否可行?
解决方案在于了解 ZipArchive 的内部工作原理。在存档被视为完整之前,需要写入某些关键字节(例如校验和)。默认情况下,ZipArchive 会关闭流来执行此操作,但在 MemoryStream 的情况下,此操作会阻止后续使用流。
为了克服这个问题,可以将 ZipArchive 的第三个参数设置为 true,这使得能够在不关闭流的情况下写入最终字节。下面修改后的代码演示了这种方法:
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); } }
通过合并此调整,用户可以使用 MemoryStream 在内存中成功创建 ZIP 存档,而不会影响存档的完整性或完整性。
以上是我可以在不使用 FileStream 的情况下使用 MemoryStream 在内存中创建 ZIP 存档吗?的详细内容。更多信息请关注PHP中文网其他相关文章!