小编典典

使用 System.IO.Compression 在内存中创建 ZIP 存档

all

我正在尝试使用一个简单的演示文本文件创建一个 ZIP 存档,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


阅读 65

收藏
2022-06-13

共1个答案

小编典典

感谢[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);
   }
}

这表明我们需要DisposeZipArchive使用它之前调用它,正如 Amir
所暗示的那样,这很可能是因为它会将最终字节(如校验和)写入使其完整的存档。但是为了不关闭流,以便在您需要true作为第三个参数传递给ZipArchive.

2022-06-13