如何在 C# 中从内存中的文件创建 ZipArchive?
How to create ZipArchive from files in memory in C#?
是否可以从内存中(而不是实际在磁盘上)的文件创建 ZipArchive。
使用案例如下:
IEnumerable<HttpPostedFileBase>
变量中接收到多个文件。我想使用 ZipArchive
将所有这些文件压缩在一起。问题是 ZipArchive
只允许 CreateEntryFromFile
,它需要文件的路径,而我只是在内存中有文件。
问题:
有没有办法使用 'stream' 在 ZipArchive
中创建 'entry',以便我可以直接将文件内容放入 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);
}
}
...
}
是的,您可以使用 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
的帮助下
是否可以从内存中(而不是实际在磁盘上)的文件创建 ZipArchive。
使用案例如下:
IEnumerable<HttpPostedFileBase>
变量中接收到多个文件。我想使用 ZipArchive
将所有这些文件压缩在一起。问题是 ZipArchive
只允许 CreateEntryFromFile
,它需要文件的路径,而我只是在内存中有文件。
问题:
有没有办法使用 'stream' 在 ZipArchive
中创建 'entry',以便我可以直接将文件内容放入 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);
}
}
...
}
是的,您可以使用 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