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

标签 c# .net zip compression c#-ziparchive

我正在尝试使用 MemoryStream 创建一个包含简单演示文本文件的 ZIP 存档,如下所示:

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))
{
    // ...
}

是否可以在没有 FileStream 的情况下使用 MemoryStream 创建 ZIP 存档?

最佳答案

感谢ZipArchive creates invalid ZIP file ,我得到了:

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);
   }
}

这表明我们需要在使用 ZipArchive 之前调用 Dispose它完成了。但为了不关闭流,以便我们可以在您需要将 true 作为第三个参数传递给 ZipArchive 后重新使用它。

关于c# - 使用 System.IO.Compression 在内存中创建 ZIP 存档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17232414/

相关文章:

c# - 在 Ninject 中是否允许将 IKernel 注入(inject)到一些地方?

c# - 带有可移植类库的 Soap Web 服务

c# - try-catch-throw 是否比根本不进行异常处理有任何值(value)?

node.js - 在 Node.js 跨平台中下载和解压缩文件的最简单方法?

php - 文件上传包含带有特殊字符的文件的 zip

c# - 使用 C# 发布自动化 mysqldump

c# - 在 SelectList 集合中设置选定项

c# - 检查滚动条是否在数据 GridView 中可见

c# - 如何将位图另存为图标?

vbscript - 使用 VBScript 从 ZIP 文件中提取文件