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#实现ini文件读写类分享

    c#实现ini文件读写类分享

    c#实现ini文件读写类分享,大家参考使用吧
    2013-12-12
  • C#利用System.Threading.Thread.Sleep即时输出信息的详解

    C#利用System.Threading.Thread.Sleep即时输出信息的详解

    本篇文章是对C#利用System.Threading.Thread.Sleep即时输出信息进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • 利用C#编写Linux守护进程实例代码

    利用C#编写Linux守护进程实例代码

    如今的编程是一场程序员和上帝的竞赛,程序员要开发出更大更好、傻瓜都会用到软件,下面这篇文章主要给大家介绍了关于利用C#编写Linux守护进程的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2018-01-01
  • C#中串口读取问题及解决方案

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

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

    C#数组反转与排序实例分析

    这篇文章主要介绍了C#数组反转与排序,实例分析了数组反转与常见的排序技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • C#中闭包概念讲解

    C#中闭包概念讲解

    这篇文章主要介绍了C#中闭包概念讲解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • C# 中类型转换方式之显式转换和 as 运算符

    C# 中类型转换方式之显式转换和 as 运算符

    在 C# 中,有两种常见的类型转换方式:显式转换和as 运算符,它们用于在不同类型之间进行转换,以下是对这两种转换方式的详细解释和示例说明,感兴趣的朋友跟随小编一起看看吧
    2024-05-05
  • insert语句太长用StringBuilder优化一下

    insert语句太长用StringBuilder优化一下

    insert语句太长用StringBuilder优化一下,下面是示例代码,需要的朋友可以研究研究
    2014-07-07
  • C#中委托和事件在观察者模式中的应用实例

    C#中委托和事件在观察者模式中的应用实例

    这篇文章主要介绍了C#中委托和事件在观察者模式中的应用,需要的朋友可以参考下
    2014-08-08
  • C# Task异步编程的实现示例

    C# Task异步编程的实现示例

    Task提供了一种更简洁的方式来处理异步编程,避免了传统多线程编程的复杂性,本文就来介绍一下C# Task异步编程的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-01-01

最新评论