首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用System.IO.Compression在内存中创建ZIP存档

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

Stack Overflow用户
提问于 2013-06-21 17:57:05
回答 10查看 222.7K关注 0票数 215

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

代码语言:javascript
复制
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直接使用文件流,即可正确创建归档文件:

代码语言:javascript
复制
using (var fileStream = new FileStream(@"C:\Temp\test.zip", FileMode.Create))
using (var archive = new ZipArchive(fileStream, FileMode.Create))
{
    // ...
}

是否可以使用MemoryStream创建ZIP归档文件而不使用FileStream

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2013-07-30 14:03:54

感谢ZipArchive创建了无效的ZIP文件我得到了:

代码语言:javascript
复制
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

票数 358
EN

Stack Overflow用户

发布于 2015-05-06 14:05:13

只是压缩的另一个版本,不需要写任何文件。

代码语言:javascript
复制
string fileName = "export_" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xlsx";
byte[] fileBytes = here is your file in bytes
byte[] compressedBytes;
string fileNameZip = "Export_" + DateTime.Now.ToString("yyyyMMddhhmmss") + ".zip";

using (var outStream = new MemoryStream())
{
    using (var archive = new ZipArchive(outStream, ZipArchiveMode.Create, true))
    {
        var fileInArchive = archive.CreateEntry(fileName, CompressionLevel.Optimal);
        using (var entryStream = fileInArchive.Open())
        using (var fileToCompressStream = new MemoryStream(fileBytes))
        {
            fileToCompressStream.CopyTo(entryStream);
        }
    }
    compressedBytes = outStream.ToArray();
}
票数 82
EN

Stack Overflow用户

发布于 2013-07-30 14:10:37

在将流复制到zip流之前,将流的位置设置为0。

代码语言:javascript
复制
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.Position=0;
     memoryStream.WriteTo(fileStream);
   }
 }
票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17232414

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档