.NET使用原生方法实现文件压缩和解压

news2024/11/16 1:32:07

前言

在.NET中实现文件或文件目录压缩和解压可以通过多种方式来完成,包括使用原生方法(System.IO.Compression命名空间中的类)和第三方库(如:SharpZipLibSharpCompressK4os.Compression.LZ4等)。本文我们主要讲的是如何使用.NET原生方法System.IO.Compression命名空间中的类来对文件和文件夹进行压缩或解压缩(压缩格式.zip文件)。

System.IO.Compression命名空间

包含为流提供基本压缩和解压缩服务的类。

包含的类

  • ZipFile:提供创建、解压缩和打开 zip 存档的静态方法。

  • ZipArchive:表示 Zip 存档格式中的一个压缩文件包。

  • ZipArchiveEntry:表示 zip 档案中的压缩文件。

  • DeflateStream:提供使用 Deflate 算法压缩和解压缩流的方法和属性。

  • GZipStream:使用 GZip 数据格式规范提供用于压缩和解压缩流的方法和属性。

  • BrotliStream:使用 Brotli 数据格式规范提供用于压缩和解压缩流的方法和属性。

  • ZipFileExtensions:为 ZipArchive 和 ZipArchiveEntry 类提供扩展方法。

  • ZLibStream:提供用于使用 zlib 数据格式规范压缩和解压缩流的方法和属性。

文件压缩的作用和场景

  • 节省存储空间:通过压缩文件,可以显著减小文件占用的磁盘空间。

  • 减少网络传输时间:在网络传输文件时,压缩文件可以减少传输时间,特别是在带宽受限或者对传输速度有要求的情况下,压缩文件可以提高传输效率。

  • 打包和分发文件:将多个文件或文件夹打包成一个压缩文件,便于整体传输、备份或者分发。这在软件发布、数据备份和文件传输中经常会用到。

  • 加密和保护文件:一些压缩工具支持对文件进行加密,可以保护文件内容不被未经授权的人看到或修改。

CompressionLevel(压缩级别)

用来指示压缩操作是强调速度还是强调压缩大小的值。

枚举类型枚举值作用说明
Optimal0压缩操作应以最佳方式平衡压缩速度和输出大小。
Fastest1即使结果文件未可选择性地压缩,压缩操作也应尽快完成。
NoCompression2该文件不应执行压缩。
SmallestSize3压缩操作应创建尽可能小的输出,即使该操作需要更长的时间才能完成。

ZipArchiveMode(Zip归档模式)

用来与 zip 存档条目进行交互的值。

枚举类型枚举值作用说明
Read0只允许读取存档项。
Create1只允许创建新的存档项。
Update2允许对存档项执行读取和写入操作。

创建.NET8控制台应用

创建名为:FileCompDecompExercise的控制台应用。

指定文件压缩为.zip文件

        static void Main(string[] args)
        {
            var sourceFilePath = @".\MySourceFile.xls"; //指定要压缩的文件路径(先创建对应.xls文件)
            var zipSourceFilePath = @".\OutputFolder\ZipSourceFilePath.zip"; //压缩后文件存放路径

            //指定文件压缩为zip文件
            CompressZipFile(sourceFilePath, zipSourceFilePath);
            Console.WriteLine("操作完成");
        }
        
        /// <summary>
        /// 指定文件压缩为zip文件
        /// </summary>
        /// <param name="sourceFilePath">指定要压缩的文件路径</param>
        /// <param name="zipFilePath">指定压缩后的zip文件路径</param>
        public static void CompressZipFile(string sourceFilePath, string zipFilePath)
        {
            //确保指定的路径中的目录存在
            DirectoryInfo directoryInfo = new DirectoryInfo(zipFilePath);
            if (directoryInfo.Parent != null)
            {
                directoryInfo = directoryInfo.Parent;
            }

            if (!directoryInfo.Exists)
            {
                directoryInfo.Create();
            }

            // 创建一个新的 Zip 存档并向其中添加指定的文件
            using (ZipArchive archive = ZipFile.Open(zipFilePath, ZipArchiveMode.Update))
            {
                archive.CreateEntryFromFile(sourceFilePath, Path.GetFileName(sourceFilePath));
            }
            Console.WriteLine("文件压缩完成");
        }
        

指定文件夹压缩为.zip文件

        static void Main(string[] args)
        {
            var sourceDirectory = @".\ZipFileDirectory";//指定压缩的文件目录(先在对应位置创建好)
            var zipFilePath = @".\OutputFolder\Archive.zip"; //压缩后文件存放路径
            CompressZipFileDirectory(sourceDirectory, zipFilePath);
            Console.WriteLine("操作完成");
        }
        
        /// <summary>
        /// 指定文件目录压缩为zip文件
        /// </summary>
        /// <param name="sourceDirectory">指定压缩的文件目录</param>
        /// <param name="zipFilePath">压缩后文件存放路径</param>
        public static void CompressZipFileDirectory(string sourceDirectory, string zipFilePath)
        {
            //确保指定的路径中的目录存在
            DirectoryInfo directoryInfo = new DirectoryInfo(zipFilePath);
            if (directoryInfo.Parent != null)
            {
                directoryInfo = directoryInfo.Parent;
            }

            if (!directoryInfo.Exists)
            {
                directoryInfo.Create();
            }

            //创建一个新的 .zip 文件并将文件夹内容压缩进去
            ZipFile.CreateFromDirectory(sourceDirectory, zipFilePath, CompressionLevel.Optimal, false);
            Console.WriteLine("文件目录压缩完成");
        }

解压.zip文件到目标文件夹

        static void Main(string[] args)
        {
            var zipFilePath = @".\OutputFolder\Archive.zip"; //压缩后文件存放路径
            string extractPath = @".\OutputFolder"; // 解压目标文件夹路径
            //解压.zip文件到目标文件夹
            ExtractZipFile(zipFilePath, extractPath);
            Console.WriteLine("操作完成");
        }

        /// <summary>
        /// 解压.zip文件到目标文件夹
        /// </summary>
        /// <param name="zipFilePath">要解压的.zip文件路径</param>
        /// <param name="extractPath">解压目标文件夹路径</param>
        public static void ExtractZipFile(string zipFilePath, string extractPath)
        {
            if (!Directory.Exists(extractPath))
            {
                Directory.CreateDirectory(extractPath);
            }

            // 提取 .zip 文件到指定文件夹
            ZipFile.ExtractToDirectory(zipFilePath, extractPath);
            Console.WriteLine("文件解压完成");
        }

本文示例源码

https://github.com/YSGStudyHards/DotNetExercises/tree/master/FileCompDecompExercise

参考文章

  • https://learn.microsoft.com/zh-cn/dotnet/api/system.io.compression.zipfile?view=net-8.0

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1859617.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

排序算法(C语言版)

前言 排序作为生产环境中常见的需求之一&#xff0c;对整个产品有举足轻重的影响&#xff0c;可以说使用一个合适的排序算法是业务逻辑中比较重要的一部分。今天我们就来介绍常见的排序算法以及实现 排序 所谓排序无非就是按照特定的规则对一组数据就行顺序化。 常见的排序有…

柠檬班车载测试视频课程

这门课程将教授学员如何进行车载测试视频拍摄。学习者将学习如何选择合适的拍摄设备、构思拍摄场景、拍摄技巧和后期制作等内容。课程结合实例演练和个性化指导&#xff0c;帮助学员掌握车载测试视频拍摄的关键技能&#xff0c;提升视频制作能力。无论您是初学者还是有经验者&a…

从移动切换到电信IP:详细介绍两种方法

在当前的互联网环境中&#xff0c;用户可能会因为各种原因需要切换网络服务提供商&#xff0c;比如从移动切换到电信。这种切换不仅涉及到网络服务的变更&#xff0c;还可能意味着IP地址的改变。那么&#xff0c;移动的怎么切换成电信的IP&#xff1f;下面一起来了解一下吧。 方…

React:tabs或标签页自定义右击菜单内容,支持内嵌iframe关闭菜单方案

React&#xff1a;tabs或标签页自定义右击菜单内容&#xff0c;支持内嵌iframe关闭菜单方案 不管是react、vue还是原生js&#xff0c;原理是一样的。 注意如果内嵌iframe情况下&#xff0c;iframe无法使用事件监听&#xff0c;但是可以使用iframe的任何点击行为都会往父级wind…

Python | Leetcode Python题解之第169题多数元素

题目&#xff1a; 题解&#xff1a; class Solution:def majorityElement(self, nums: List[int]) -> int:count 0candidate Nonefor num in nums:if count 0:candidate numcount (1 if num candidate else -1)return candidate

查看es p12证书文件过期方法

查看证书过期时间: openssl pkcs12 -in elastic-certificates.p12 -nokeys -out elastic-certificates.crt (需要输入证书生成时配置密码) openssl x509 -enddate -noout -in elastic-certificates.crt

Elasticsearch 使用误区之一——将 Elasticsearch 视为关系数据库!

Elasticsearch 是一个强大的工具&#xff0c;尤其在全文检索、实时分析、机器学习、地理数据应用、日志和事件数据分析、安全信息和事件管理等场景有大量的应用。 然而&#xff0c;Elastic Stack 技术栈的选型及应用效能取决于正确的使用方式。选型错误或者误用 Elasticsearch …

如何在Windows系统部署Terraria私服并配置公网地址实现远程联机

文章目录 前言1. 下载Terraria私服2. 本地运行Terraria 私服3. 本地Terraria私服连接4. Windwos安装Cpolar 工具5. 配置Terraria远程联机地址6. Terraria私服远程联机7. 固定远程联机地址8. 固定的联机地址测试 前言 本文将为你详细介绍在本地如何运行泰拉瑞亚本地私服和结合C…

Recovery

Steal&#xff1a;允许未提交的事务写到磁盘上 Force&#xff1a;在事务提交之前该事务所有更新必须被写到磁盘上 No-StealForce 性能差&#xff0c;需要等待修改被写到磁盘上才能顺利commit 不需要undo&#xff0c;因为aborted事务不会被写到磁盘上 不需要redo&#xff0…

Ubuntu Apache2 搭建Gerrit 环境

一、前言 时隔多年&#xff0c;好久没有更新CSDN 博客了&#xff0c;主要原因有如下两点&#xff1a; 1、平时工作繁忙&#xff0c;无暇更新。 2、工作内容涉及信息安全&#xff0c;一些工作经验积累不便更新到互联网上。 最近一直在折腾搭建Gerrit 环境&#xff0c;最开始…

红酒邂逅时尚,品味生活的双重魅力,引领潮流新风尚

在繁华的都市中&#xff0c;红酒与时尚如同一对孪生姐妹&#xff0c;共同诠释着品味生活的双重魅力。红酒&#xff0c;那深邃的色泽中蕴藏着千年的历史与文化&#xff1b;时尚&#xff0c;那流转的光影中凝聚着时代的潮流与个性。当两者相遇&#xff0c;便碰撞出了特别的火花&a…

BEVDistill

摘要 将激光雷达检测器纳入多视图 3D 物体检测&#xff0c;在 BEV 空间中统一图像和激光雷达特征&#xff0c;让图像BEV特征自适应学习点云BEV特征。 背景 LiDAR 点可捕获精确的 3D 空间信息&#xff0c;为基于相机的目标检测提供自然指导。鉴于此&#xff0c;最近的相关工作…

Handling `nil` Values in `NSDictionary` in Objective-C

Handling nil Values in NSDictionary in Objective-C When working with Objective-C, particularly when dealing with data returned from a server, it’s crucial (至关重要的) to handle nil values appropriately (适当地) to prevent unexpected crashes. Here, we ex…

ModbusRTU协议报文解析

ModbusRTU协议报文解析 报文格式&#xff1a; 设备地址/从站地址&#xff1a; 1个字节 指定目标设备地址&#xff08;从站地址&#xff09; 功能码&#xff1a;1个字节 功能码在modbus协议用于表示信息帧的功能&#xff0c;例如读取线圈状态、读取寄存器等。 数据&#xff…

SSRF漏洞原理与案例分析

一、什么是SSRF漏洞 SSRF (Server-Side Request Forgery&#xff1a;服务器端请求伪造)是一种由攻击者构造请求&#xff0c;由服务端发起请求的安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是外网无法访问的内部系统(正因为请求是由服务端发起的&#xff0c;所以服务端能请…

论文速递 | Management Science 4月文章合集(下)

编者按 在本系列文章中&#xff0c;我们梳理了运筹学顶刊Management Science在2024年4月份发布有关OR/OM以及相关应用的13篇文章的基本信息&#xff0c;旨在帮助读者快速洞察领域新动态。本文为第二部分&#xff08;2/2&#xff09;。 推荐文章1 ● 题目&#xff1a;Social Le…

HarmonyOS应用开发——Hello World

下载 HUAWEI DevEco Studio: https://developer.harmonyos.com/cn/develop/deveco-studio/#download 同意&#xff0c;进入配置页面&#xff1a; 配置下载源以及本地存放路径&#xff0c;包括nodejs和ohpm: 配置鸿蒙SDK路径&#xff1a; 接受协议&#xff1a; 确认无误后&#…

面试-细聊synchronized

1.线程安全问题的主要诱因&#xff1a; 存在多条共享数据(临界资源) 存在多条线程共同操作这些共享数据 解决问题的根本方法&#xff1a; 同一时刻有且仅有一个线程在操作共享数据&#xff0c;其他线程必须等到该线程处理完数据后在对共享数据进行操作。 2.synchroized锁 分…

边缘计算为企业解决数据问题,提升业务效率和竞争力-天拓四方

企业在当前数字化时代面临着一系列具体的问题和挑战&#xff0c;这些问题往往与数据处理、实时响应、安全性以及运营成本等方面密切相关。边缘计算作为一种新兴的计算模型&#xff0c;能够有效地帮助企业解决这些问题&#xff0c;提升业务效率和竞争力。 首先&#xff0c;企业…

清华、北大与微软推出Glyph-ByT5-v2,精准生成文字海报,支持10种语言,效果炸裂

前言 在 AI 领域&#xff0c;文生图技术已经取得了令人惊叹的进展&#xff0c;但如何将文字精准地融入图像&#xff0c;并支持多种语言&#xff0c;一直是研究人员面临的挑战。为了解决这一难题&#xff0c;清华大学、北京大学和微软亚洲研究院的研究人员合作推出了 Glyph-ByT…