public static Stream CreateZip(List<string> listPath, int level = 5)
{
MemoryStream mstream = new MemoryStream();
using (ZipOutputStream zipstream = new ZipOutputStream(mstream))
{
zipstream.SetLevel(level);
Crc32 crc = new Crc32();
foreach (var path in listPath)
{
FileStream fs = File.Open(path, FileMode.Open);
//重置流的位置
fs.Position = 0L;
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
//ZIP文件条目
ZipEntry entry = new ZipEntry(Path.GetFileName(path));
entry.DateTime = DateTime.Now;
entry.Size = fs.Length;
fs.Close();
crc.Reset();
crc.Update(buffer);
//冗余校验码
entry.Crc = crc.Value;
zipstream.PutNextEntry(entry);
zipstream.Write(buffer, 0, buffer.Length);
}
//ZipOutputStream关闭后不关闭mstream
zipstream.IsStreamOwner = false;
}
//重置流的位置
mstream.Position = 0L;
return mstream;
}
使用流读取并压缩文件。
zipstream.IsStreamOwner = false;
必须设置
在MVC中使用FileStreamResult File(Stream fileStream, string contentType, string fileDownloadName)方法可直接下载。
contentType可使用"application/x-zip-compressed"表示zip文件类型。