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

2024-03-14 06:12

本文主要是介绍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

这篇关于C#使用SharpZipLib对文件进行压缩和解压的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/807459

相关文章

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

Spring Security简介、使用与最佳实践

《SpringSecurity简介、使用与最佳实践》SpringSecurity是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架,本文给大家介绍SpringSec... 目录一、如何理解 Spring Security?—— 核心思想二、如何在 Java 项目中使用?——

springboot中使用okhttp3的小结

《springboot中使用okhttp3的小结》OkHttp3是一个JavaHTTP客户端,可以处理各种请求类型,比如GET、POST、PUT等,并且支持高效的HTTP连接池、请求和响应缓存、以及异... 在 Spring Boot 项目中使用 OkHttp3 进行 HTTP 请求是一个高效且流行的方式。

Java使用Javassist动态生成HelloWorld类

《Java使用Javassist动态生成HelloWorld类》Javassist是一个非常强大的字节码操作和定义库,它允许开发者在运行时创建新的类或者修改现有的类,本文将简单介绍如何使用Javass... 目录1. Javassist简介2. 环境准备3. 动态生成HelloWorld类3.1 创建CtC

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结

Java使用jar命令配置服务器端口的完整指南

《Java使用jar命令配置服务器端口的完整指南》本文将详细介绍如何使用java-jar命令启动应用,并重点讲解如何配置服务器端口,同时提供一个实用的Web工具来简化这一过程,希望对大家有所帮助... 目录1. Java Jar文件简介1.1 什么是Jar文件1.2 创建可执行Jar文件2. 使用java

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有