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