【问题标题】:Creating Zip file with multiple entries创建具有多个条目的 Zip 文件
【发布时间】:2017-03-14 10:50:20
【问题描述】:

我在创建包含多个条目的 zip 文件时遇到问题。我已经查看了this 类似问题的答案,但仍然没有喜悦。我的代码如下:

var folders = await _folderManager.GetDescendentsAsync(id);

using (MemoryStream memoryStream = new MemoryStream())
{
    // Build the archive
    using (ZipArchive zipArchive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
    {
        foreach (var folder in folders)
        {
            //get the path 
            var path = GetPath(folder);

            foreach (var file in folder.Documents)
            {
                //get the file stream from storage
                var docStream = _documentManager.DownloadById(file.Id);

                //create an entry in the zip
                ZipArchiveEntry archiveEntry = zipArchive.CreateEntry(path + file.Name);
                using (var entryStream = archiveEntry.Open())
                {
                    await docStream.CopyToAsync(entryStream);
                }
            }
        }

        using (var fileStream = new FileStream(@"C:\Temp\ZipFile.zip", FileMode.Create))
        {
            memoryStream.Seek(0, SeekOrigin.Begin);
            await memoryStream.CopyToAsync(fileStream);
        }
    }
}

我获得了包含多个条目的 zip 文件,但是当我尝试打开它时收到错误“存档意外结束”。

谁能告诉我我做错了什么?

【问题讨论】:

  • 关闭/刷新 zip 存档 之前 使用 CopyTo 保存结果
  • 您可能需要刷新memoryStream,请参见此处:stackoverflow.com/questions/9469434/…
  • 啊!现在如此明显,但我看不到树木的树林!我正在使用语句复制到 zip 存档中的 fileStream。通过让 zipArchive 处理,我能够复制到文件流。无需冲洗。

标签: c# .net zip compression


【解决方案1】:

CopyToAsync 方法将一个流的内容以块的形式复制到另一个流。如果在流的末尾块小于块大小,它并不总是被复制到另一个流。要解决此问题,您可以 FlushFlushAsync memoryStream

using (var fileStream = new FileStream(@"C:\Temp\ZipFile.zip", FileMode.Create))
{
    memoryStream.Seek(0, SeekOrigin.Begin);
    await memoryStream.CopyToAsync(fileStream);

    await memoryStream.FlushAsync();
}

【讨论】:

  • 恐怕还是没有运气。我还尝试在“await docStream.CopyToAsync(entryStream);”之后刷新 entryStream :-(
  • @Orbit74 哦,没看到你也在那里复制,你有没有试过在CopyToAsync 调用之后刷新docStream
猜你喜欢
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-29
  • 2021-03-18
  • 1970-01-01
相关资源
最近更新 更多