C# ZipArchive加压解压zip文件方式

 更新时间:2025年11月06日 14:11:58   作者: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);
                         }
                     }
                 }

总结

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

相关文章

  • C#实现json格式转换成对象并更换key的方法

    C#实现json格式转换成对象并更换key的方法

    这篇文章主要介绍了C#实现json格式转换成对象并更换key的方法,涉及C#操作json格式数据的相关技巧,需要的朋友可以参考下
    2015-06-06
  • C#使用融合通信API发送手机短信息

    C#使用融合通信API发送手机短信息

    融合云通信服务平台,为企业提供全方位通信服务,发送手机短信是其一项核心功能,本文将讲述如何使用融合云服务API为终端手机用户发送短信信息,并使用 C# 进行实现,感兴趣的可以了解下
    2024-11-11
  • C# 8.0中的范围类型(Range Type)示例详解

    C# 8.0中的范围类型(Range Type)示例详解

    这篇文章主要给大家介绍了关于C# 8.0中范围类型(Range Type)的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • C#实现HTML转WORD及WORD转PDF的方法

    C#实现HTML转WORD及WORD转PDF的方法

    这篇文章主要介绍了C#实现HTML转WORD及WORD转PDF的方法,涉及C#实现HTML、WORD及PDF等文件格式转换的相关技巧,需要的朋友可以参考下
    2015-09-09
  • C#如何实时获取鼠标坐标及模拟鼠标点击

    C#如何实时获取鼠标坐标及模拟鼠标点击

    这篇文章主要介绍了C#如何实时获取鼠标坐标及模拟鼠标点击问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • C# Winform按钮中图片实现左图右字的效果实例

    C# Winform按钮中图片实现左图右字的效果实例

    这篇文章主要给大家介绍了关于C# Winform按钮中图片实现左图右字效果的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 使用C#进行音频处理的完整指南(从播放到编辑)

    使用C#进行音频处理的完整指南(从播放到编辑)

    在现代应用程序中,音频处理已经成为不可或缺的一部分,无论是开发一个简单的音频播放器,还是构建一个复杂的音频编辑工具,C#都提供了丰富的工具和库来实现这些功能,通过本文,我们将深入探索如何在C#中进行音频播放、录制、编辑、格式转换以及音频分析
    2025-04-04
  • C#中串口读取问题及解决方案

    C#中串口读取问题及解决方案

    在现代计算机系统中,串口通信仍然是许多设备和应用程序之间进行数据交换的重要方式,无论是在工业自动化、嵌入式系统,还是在日常的硬件调试中,串口都扮演着不可或缺的角色,本文旨在深入探讨C#中串口读取问题的常见原因,并提供一系列有效的解决方案,需要的朋友可以参考下
    2024-12-12
  • C#网页跳转方法总结

    C#网页跳转方法总结

    这篇文章主要介绍了C#网页跳转方法总结的相关资料,需要的朋友可以参考下
    2015-12-12
  • 在C#中基于Semantic Kernel的检索增强生成(RAG)实践记录

    在C#中基于Semantic Kernel的检索增强生成(RAG)实践记录

    SemanticKernel是一个用于集成和操作大语言模型的应用程序框架,支持C#、Python和Java等多种编程语言,通过SemanticKernel,开发者可以轻松构建基于最新AI技术的应用程序
    2024-10-10

最新评论