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

How to create ZipArchive from files in memory in C#?

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

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

问题: 有没有办法使用 'stream' 在 ZipArchive 中创建 'entry',以便我可以直接将文件内容放入 zip 中?

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

这里,attachmentFilesIEnumerable<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);
        }
    }
    ...
}

是的,您可以使用 ZipArchive.CreateEntry method, as @AngeloReis pointed out in the comments, and described here 解决稍微不同的问题。

您的代码将如下所示:

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

首先感谢@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

的帮助下