C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > C# ZipArchive加压解压zip文件

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

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文