提问者:小点点

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


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

以下是用例:多个文件在IENumable中被接收

问题:有没有一种方法可以使用“流”在ZipArchive中创建“条目”,这样我就可以直接将文件的内容放入zip中?

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

这里,attachmentFilesIEnumerable

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

共2个答案

匿名用户

是的,你可以用拉链箱来做。CreateEntry方法,正如@Angelore在注释中指出的,这里描述的是一个稍微不同的问题。

您的代码将如下所示:

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

    ...
}

借助系统。木卫一。压缩。ZipFileExtensions