C#使用SharpZipLib对文件进行压缩和解压

C#使用SharpZipLib对文件进行压缩和解压

使用SharpZipLib库

编写SharpZipLibHelper帮助类

using ICSharpCode.SharpZipLib.Zip;namespace SharpZipLib_Project
{public class SharpZipLibHelper{/// <summary>/// 多个文件或文件夹压缩/// </summary>/// <param name="sourcePaths">文件或文件夹名称</param>/// <param name="zipFilePath">压缩文件夹名称</param>public static string CompressFilesAndDirectories(string[] sourcePaths, string zipFilePath){try{using (FileStream fsOut = File.Create(zipFilePath)){using (ZipOutputStream zipStream = new ZipOutputStream(fsOut)){foreach (string sourcePath in sourcePaths){if (Directory.Exists(sourcePath)){CompressDirectoryRecursive(sourcePath, zipStream);}else if (File.Exists(sourcePath)){CompressFile(sourcePath, zipStream);}else{Console.WriteLine($"Path '{sourcePath}' does not exist.");}}}}return "成功";}catch (Exception ex){return ex.Message;}}/// <summary>/// 向压缩文件添加文件/// </summary>/// <param name="sourceFilePath"></param>/// <param name="zipStream"></param>/// <returns></returns>private static string CompressFile(string sourceFilePath, ZipOutputStream zipStream){try{string entryName = Path.GetFileName(sourceFilePath);ZipEntry newEntry = new ZipEntry(entryName);zipStream.PutNextEntry(newEntry);byte[] buffer = new byte[4096];using (FileStream fsIn = File.OpenRead(sourceFilePath)){int sourceBytes;do{sourceBytes = fsIn.Read(buffer, 0, buffer.Length);zipStream.Write(buffer, 0, sourceBytes);} while (sourceBytes > 0);}return "成功";}catch (Exception ex){return ex.Message;}}/// <summary>/// 向压缩文件添加文件夹/// </summary>/// <param name="rootDirectoryPath"></param>/// <param name="currentDirectoryPath"></param>/// <param name="zipStream"></param>/// <returns></returns>private static string CompressDirectoryRecursive(string sourceDirectoryPath, ZipOutputStream zipStream){try{string[] files = Directory.GetFiles(sourceDirectoryPath, "*", SearchOption.AllDirectories);string rootDirectoryName = Path.GetFileName(sourceDirectoryPath);// 添加文件夹本身ZipEntry rootDirectoryEntry = new ZipEntry(rootDirectoryName + "/");zipStream.PutNextEntry(rootDirectoryEntry);// 添加文件夹内的文件和子文件夹foreach (string file in files){string relativePath = Path.GetRelativePath(sourceDirectoryPath, file);ZipEntry newEntry = new ZipEntry(rootDirectoryName + "/" + relativePath);zipStream.PutNextEntry(newEntry);byte[] buffer = new byte[4096];using (FileStream fsIn = File.OpenRead(file)){int sourceBytes;while ((sourceBytes = fsIn.Read(buffer, 0, buffer.Length)) > 0){zipStream.Write(buffer, 0, sourceBytes);}}}return "成功";}catch (Exception ex){return ex.Message;}}/// <summary>/// 解压文件/// </summary>/// <param name="zipFilePath">压缩文件地址</param>/// <param name="extractPath">解压文件夹</param>/// <returns></returns>public static string DecompressFile(string zipFilePath, string extractPath){try{if (!Directory.Exists(extractPath))Directory.CreateDirectory(extractPath);using (FileStream fsIn = new FileStream(zipFilePath, FileMode.Open, FileAccess.Read)){using (ZipInputStream zipStream = new ZipInputStream(fsIn)){ZipEntry entry;while ((entry = zipStream.GetNextEntry()) != null){string entryFileName = Path.Combine(extractPath, entry.Name);string directoryName = Path.GetDirectoryName(entryFileName);if (directoryName.Length > 0 && !Directory.Exists(directoryName))Directory.CreateDirectory(directoryName);if (entry.IsFile){using (FileStream fsOut = File.Create(entryFileName)){byte[] buffer = new byte[4096];int sourceBytes;while ((sourceBytes = zipStream.Read(buffer, 0, buffer.Length)) > 0){fsOut.Write(buffer, 0, sourceBytes);}}}}}}return "成功";}catch (Exception ex){return ex.Message;}}}
}

如何使用工具类

private void button1_Click(object sender, EventArgs e)
{// 压缩文件string[] sourcePaths = { "example.txt", "Example", "example1.txt"};string str = SharpZipLibHelper.CompressFilesAndDirectories(sourcePaths, "example.zip");if (str != "成功"){MessageBox.Show($"压缩失败: {str}");}else{MessageBox.Show("压缩成功!");}
}private void button2_Click(object sender, EventArgs e)
{// 解压缩文件string str = SharpZipLibHelper.DecompressFile("example.zip", "extracted_files");if (str != "成功"){MessageBox.Show($"解压失败: {str}");}else{MessageBox.Show("解压成功!");}
}

备注: 这种压缩方法无法压缩空的文件夹,因为空的文件夹里面没有文件路径,所有会自动忽略.如果需要添加空文件夹需要自己先判断目录是否为空,然后自己在压缩文件中创建就可以了

2024.3.13

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

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

相关文章

序列化Serializable/Parcelable

定义 将一个对象转换成可存储或可传输的状态。&#xff08;对象转换成字节流的过程&#xff09; 作用 对象序列化后&#xff0c;可以在进程间、网络间进行传输&#xff0c;也可以做本地持久化存储 为什么要序列化 对于计算机来说&#xff0c;不认识对象只认识二进制。数据…

vue父子组件生命周期

父子组件的生命周期是一个嵌套的过程 渲染的过程 父beforeCreate->父created->父beforeMount->子beforeCreate->子created->子beforeMount->子mounted->父mounted 子组件更新过程 父beforeUpdate->子beforeUpdate->子updated->父updated 父组件更…

行业认可 | 海云安上榜《2024年网络与信息安全行业全景图》多个领域

近日&#xff0c;深圳市网络与信息安全行业协会正式发布《2024年网络与信息安全行业全景图》。海云安凭借过硬的技术实力及成熟的网络与信息安全产品及服务获得行业认可&#xff0c;入围6大类目共计17项细分领域。包括&#xff1a; 业务安全&#xff08;软硬件开发安全、人工智…

MFC中字符串string类型和CString类型互转方法

在Microsoft Foundation Classes (MFC)中&#xff0c;CString是一个非常方便的类&#xff0c;用于处理C风格的字符串。有时&#xff0c;你可能需要在MFC的CString和C标准库中的std::string之间进行转换。下面是如何在两者之间进行转换的方法&#xff1a; CString转std::string…

C++向函数传递函数

函数指针的定义格式为&#xff1a; <函数返回类型> (*指针变量)(<函数形参列表>) 例如&#xff1a; 下面定义了一个函数指针变量fp: double (*fp)(int);这意味着fp可以指向返回类型为double,参数类型为int的任何函数 比如&#xff1a; double func(int x){...}获…

如何配置Log4j以便将日志信息输出到文件,并指定日志文件的格式?请解释Log4j中的PatternLayout,并给出一个常用的日志格式模式。

如何配置Log4j以便将日志信息输出到文件&#xff0c;并指定日志文件的格式&#xff1f; 配置Log4j以将日志信息输出到文件并指定日志文件的格式&#xff0c;通常涉及创建一个配置文件&#xff08;如log4j.properties或log4j2.xml&#xff09;&#xff0c;其中定义了Log4j的行为…

前端项目,个人笔记(一)【定制化主题 + 路由设计】

目录 1、项目准备 1.1、项目初始化 1.2、elementPlus按需引入 注&#xff1a;使用cnpm安装elementplus及两个插件&#xff0c;会报错&#xff1a;vueelement-plus报错TypeError: Cannot read properties of null (reading isCE ) &#xff0c;修改&#xff1a; 测试&#…

欧科云链做客Google Cloud与WhalerDAO专题论坛,畅谈Web3数据机遇

3月10日&#xff0c;由Google Cloud、WhalerDAO和baidao data主办&#xff0c;以Web3AI 2024 DATA POWER为主题的分享会在北京中关村举行。欧科云链高级研究员Jason Jiang受邀参加活动&#xff0c;带来“从链上数据发掘Web3时代的无限机遇”的主题分享。 Web3.0核心要素始终是链…

你不知道的 git 神器

有没有这种困惑&#xff0c;就是在一个分支上开发一堆功能&#xff0c;提交了很多 commit&#xff0c;但是突然上级告诉你&#xff0c;只上一个功能&#xff0c;你是不是束手无策&#xff0c;需要在这个分支上重新检出新分支&#xff0c;然后把不上的代码全部删掉。等后续需要的…

上位机图像处理和嵌入式模块部署(qmacvisual自己编写算法插件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;qmacvisual本身支持52个控件&#xff0c;但是指望这52个控件可以cover所有的应用场景&#xff0c;这也不太现实。另外&am…

自定义方法SQL注入器-DefaultSqlInjector

/*** 自定义Sql注入* author zy*/ public class SqlInjector extends DefaultSqlInjector {Overridepublic List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {// 注意&#xff1a;此SQL注入器继承了DefaultSqlInjector(默认注入器…

2024 年排名前 5 名的 Mac 数据恢复软件分享

如果您已经在 Mac 上丢失了数据并且正在寻找恢复数据的方法&#xff0c;那么您来对地方了。互联网上有超过 50 个适用于 Mac 的数据恢复程序。哪个是最好的 Mac 数据恢复软件&#xff1f;不用担心。本文列出了 5 款 Mac 数据恢复软件&#xff0c;可帮助您在 Mac OS 下恢复丢失的…

探索信号处理:低通滤波器的原理与应用

在信号处理领域&#xff0c;滤波器的应用至关重要&#xff0c;它能够帮助我们从复杂的信号中提取需要的信息&#xff0c;而低通滤波器则是其中一种被广泛应用的滤波器类型。本文旨在深入探讨低通滤波器的基本原理、主要类型以及在实际应用中的作用和实现方式。 ### 1. 低通滤波…

【JavaScript 漫游】【036】CORS 通信总结

文章简介 CORS 是一个 W3C 标准&#xff0c;全称是“跨域资源共享”&#xff08;Cross-origin resource sharing&#xff09;。它允许浏览器向跨域的服务器&#xff0c;发出 XMLHttpRequest 请求&#xff0c;从而克服了 AJAX 只能同源使用的限制。 本篇文章为【JavaScript 漫…

N折交叉验证的作用

重点放在前面&#xff1a; N折交叉验证有两个用途&#xff1a;模型评估、模型选择。N折交叉只是一种划分数据集的策略。想知道它的优势&#xff0c;可以拿它和传统划分数据集的方式进行比较。它可以避免固定划分数据集的局限性、特殊性&#xff0c;这个优势在小规模数据集上更…

高频:spring知识

1、bean的生命周期&#xff1f; 主要阶段 初始化 org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh 信息: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext67424e82: startup date []; root of context hi…

数据结构:7、队列

一、队列的概念与结构 队列&#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出FIFO(First In First Out) 入队列&#xff1a;进行插入操作的一端称为队尾 出队列&#xff1a;进行删除操作的一端称为队头…

动态规划概念

前言 动态规划&#xff08;Dynamic Programming&#xff0c;DP&#xff09;是一种优化问题求解方法&#xff0c;通常用于解决具有重叠子问题和最优子结构性质的问题。它的基本思想是将原问题分解成更小的子问题&#xff0c;通过求解和保存这些子问题的解&#xff0c;避免重复计…

电商数据分析20——电商平台用户分层与细分策略的数据分析

目录 写在开头1. 用户分层与细分的重要性1.1 用户分层与细分的定义1.2 对电商营销策略的影响2. 数据分析在用户分层与细分中的应用2.1 用户行为数据的收集与分析2.1.1. 数据收集机制2.1.2. 关键用户行为指标2.2 用户属性和行为的聚类分析2.2.1. 聚类分析在用户细分中的应用2.2.…

漫途桥梁结构安全监测方案,护航桥梁安全!

桥梁作为城市生命线的重要组成部分&#xff0c;承载着城市交通、物流输送、应急救援等重要职能。然而&#xff0c;随着我国社会经济的飞速发展&#xff0c;桥梁所承载的交通流量逐年增长&#xff0c;其安全性所面临的挑战亦日益严峻。例如恶劣的外部环境、沉重的荷载以及长期使…