问题 如何从C#内存中的文件创建ZipArchive?


是否有可能从内存中的文件(而不是实际上在磁盘上)创建ZipArchive。

以下是用例:  在一个接收多个文件 IEnumerable<HttpPostedFileBase> 变量。我想用所有这些文件压缩在一起 ZipArchive。问题是 ZipArchive 只允许 CreateEntryFromFile,它需要一个文件的路径,因为我只有内存中的文件。

题:  有没有办法使用'流'来创建'条目' ZipArchive,这样我可以直接在zip中输入文件的内容?

我不想先保存文件,创建zip(从保存文件的路径),然后删除单个文件。

这里, attachmentFiles 是 IEnumerable<HttpPostedFileBase>

using (var ms = new MemoryStream())
{
    using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true))
    {
        foreach (var attachment in attachmentFiles)
        {
            zipArchive.CreateEntryFromFile(Path.GetFullPath(attachment.FileName), Path.GetFileName(attachment.FileName),
                                CompressionLevel.Fastest);
        }
    }
    ...
}

9052
2018-04-15 10:15


起源

你试过这个吗? stackoverflow.com/questions/12347775/... ? - Angelo Reis
为什么不创建一个临时文件,然后在存档完成后发布? - RussDunn
我希望尽可能避免创建临时文件并在之后删除它。这就是我在问题中所写的内容,但如果没有别的办法,那么我就必须这样做。 - Flair


答案:


是的,你可以这样做,使用 ZipArchive.CreateEntry 方法,如@AngeloReis在评论中指出,并进行了描述 这里 对于稍微不同的问题。

您的代码将如下所示:

using (var ms = new MemoryStream())
{
    using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true))
    {
        foreach (var attachment in attachmentFiles)
        {
            var entry = zipArchive.CreateEntry(attachment.FileName, CompressionLevel.Fastest);
            using (var entryStream = entry.Open())
            {
                attachment.InputStream.CopyTo(entryStream);
            }
        }
    }
    ...
}

15
2018-04-15 10:57



工作就像一个魅力,谢谢!我用它创建了一堆PDF格式的zip文件,我把它作为byte []存储在数据库中。根本不需要涉及文件系统。用户单击按钮,然后通过Web浏览器下载.zip文件。 (顺便说一下,在最内层的“使用”块中,我使用了entryStream.Write(arrBytes,0,arrBytes.Length); - ClearCloud8
什么是attachmentFiles? - Demodave
我不得不补充一下 ms.Seek(0, SeekOrigin.Begin); 在我可以使用之前的最后。 - rob


首先感谢@Alex的完美答案。
此外,您还需要从文件系统中读取:

using (var ms = new MemoryStream())
{
    using (var zipArchive = new ZipArchive(ms, ZipArchiveMode.Create, true))
    {
        foreach (var file in filesAddress)
        {
            zipArchive.CreateEntryFromFile(file, Path.GetFileName(file));
        }
    }

    ...
}

在...的帮助下 System.IO.Compression.ZipFileExtensions


0
2018-06-07 08:24