C# ZipArchive加压解压zip文件方式
作者:mouka~
本文介绍了一种在内存中创建zip文件并获取其流的方法,从而避免了创建临时文件和下载文件的需要,最后展示了如何解压该zip文件
创建zip文件
using (var fileStream = new FileStream(saveZipName, FileMode.CreateNew))
{
// 使用内存流创建压缩文件
using (var archive = new ZipArchive(fileStream, ZipArchiveMode.Create, true))
{
var files = Directory.GetFiles(taskDir, "*", SearchOption.AllDirectories);
foreach (var file in files)
{
//相对路径
var relativePath = Path.GetRelativePath(FileAndFolderConfig.CollectionSpaceFolder.Path, file);
archive.CreateEntryFromFile(file, relativePath);
}
}
}获取zip文件流,在内存中创建zip文件避免创建临时文件
using (var memoryStream = new MemoryStream())
{
// 使用内存流创建压缩文件
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
var files = Directory.GetFiles(taskDir, "*", SearchOption.AllDirectories);
foreach (var file in files)
{
//相对路径
var relativePath = Path.GetRelativePath(FileAndFolderConfig.CollectionSpaceFolder.Path, file);
var entry = archive.CreateEntry(relativePath, CompressionLevel.Optimal);
using var entryStream = entry.Open();
using var fileStream = File.OpenRead(file);
await fileStream.CopyToAsync(entryStream);
}
}
memoryStream.Position = 0; // 重置流位置
}下载文件并解压
// 下载文件到内存流
using (var memoryStream = new MemoryStream())
{
await taskFile.CopyToAsync(memoryStream);
taskFile.Close();
memoryStream.Position = 0; // 重置流位置
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Read))
{
foreach (var entry in archive.Entries)
{
var entryOutputPath = Path.Combine(FileAndFolderConfig.CollectionSpaceFolder.Path, entry.FullName);
// 如果是目录条目,创建目录
if (string.IsNullOrEmpty(entry.Name))
{
Directory.CreateDirectory(Path.GetDirectoryName(entryOutputPath));
continue;
}
// 确保父目录存在
var parentDir = Path.GetDirectoryName(entryOutputPath);
if (!string.IsNullOrEmpty(parentDir))
{
Directory.CreateDirectory(parentDir);
}
// 解压文件
entry.ExtractToFile(entryOutputPath, overwrite: true);
}
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
