使用 MemoryStream 在内存中创建 ZIP 存档:克服空条目问题
尝试使用 MemoryStream 在内存中创建 ZIP 存档时开发人员遇到了一个特殊的问题:即使写入了相应的文本文件,创建的存档仍包含一个空文件。此行为归因于过程中缺少一个步骤。
要解决此问题,关键是在尝试访问其底层流之前对 ZipArchive 对象调用 Dispose。这种做法是必要的,因为 ZipArchive 将最终字节写入存档的校验和,使其完整。但是,如果我们希望流保持打开状态以供进一步使用,则需要将 true 作为第三个参数传递给 ZipArchive。
以下是包含此解决方案的修订后的代码片段:
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 存档,而不会遇到空条目的问题。
以上是使用 MemoryStream 创建内存中 ZIP 存档时如何避免空条目?的详细内容。更多信息请关注PHP中文网其他相关文章!