.NET C# 将文件夹压缩至 zip

.NET C# 将文件夹压缩至 zip

文章目录

  • .NET C# 将文件夹压缩至 zip
    • 1 使用 System.IO.Compression
      • 1.1 环境
      • 1.2 压缩文件夹
        • 1.2.1 简单压缩
        • 1.2.2 复杂压缩
      • 1.3 解压缩
        • 1.3.1 简单解压缩
        • 1.3.2 复杂解压缩
    • 2 使用 SharpZipLib
      • 2.1 环境
      • 2.2 压缩文件夹
      • 2.3 解压缩
    • 3 压缩效果简单测试

1 使用 System.IO.Compression

1.1 环境

  • .NET 6

1.2 压缩文件夹

1.2.1 简单压缩
using System.IO.Compression;string sourceDirectory = @"C:\path\to\your\folder"; // 需要压缩的文件夹路径
string destinationZipFilePath = @"C:\path\to\your\output.zip"; // 生成的zip文件路径
// 压缩文件夹
ZipFile.CreateFromDirectory(sourceDirectory, destinationZipFilePath);

注意事项

  • 请确保路径正确,并且具有对该路径的读写权限。
  • 如果目标zip文件已存在,该方法将覆盖该文件。如果你想避免覆盖,可以在压缩前检查文件是否存在,并进行相应处理。
1.2.2 复杂压缩

如果你需要更复杂的压缩选项,比如排除某些文件或文件夹,可以使用ZipArchive类来进行更细粒度的控制。

using System.IO.Compression;string sourceDirectory = @"C:\path\to\your\folder";
string destinationZipFilePath = @"C:\path\to\your\output.zip";using (FileStream zipToOpen = new FileStream(destinationZipFilePath, FileMode.Create))
{using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Create)){DirectoryInfo directorySelected = new DirectoryInfo(sourceDirectory);foreach (FileInfo fileToCompress in directorySelected.GetFiles()){// 过滤特定文件(例如,排除所有.txt文件)if (fileToCompress.Extension == ".txt")continue;archive.CreateEntryFromFile(fileToCompress.FullName, fileToCompress.Name);}}
}

1.3 解压缩

1.3.1 简单解压缩
using System.IO.Compression;string sourceZipFilePath = @"C:\path\to\your\archive.zip"; // 需要解压缩的zip文件路径
string destinationDirectory = @"C:\path\to\your\output\folder"; // 解压缩到的目标文件夹路径
// 解压缩zip文件
ZipFile.ExtractToDirectory(sourceZipFilePath, destinationDirectory);

注意事项

  • 请确保路径正确,并且具有对该路径的读写权限。
  • 如果目标文件夹已存在且包含与zip文件中相同名称的文件,该方法将抛出异常。如果你想避免此问题,可以在解压缩前检查文件夹是否存在,并进行相应处理。
1.3.2 复杂解压缩
using System.IO.Compression;string sourceZipFilePath = @"C:\path\to\your\archive.zip";
string destinationDirectory = @"C:\path\to\your\output\folder";using (ZipArchive archive = ZipFile.OpenRead(sourceZipFilePath))
{foreach (ZipArchiveEntry entry in archive.Entries){// 解压缩所有文件到目标文件夹string destinationPath = Path.Combine(destinationDirectory, entry.FullName);// 如果条目是目录,则创建目录if (entry.Name == ""){Directory.CreateDirectory(destinationPath);}else{// 创建包含该条目的目录Directory.CreateDirectory(Path.GetDirectoryName(destinationPath));// 解压缩文件entry.ExtractToFile(destinationPath, overwrite: true);}}
}

2 使用 SharpZipLib

2.1 环境

  • .NET 6
  • SharpZipLib 1.4.2

2.2 压缩文件夹

using System;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;class Program
{static void Main(){string sourceDirectory = @"C:\path\to\your\folder"; // 需要压缩的文件夹路径string destinationZipFilePath = @"C:\path\to\your\output.zip"; // 生成的zip文件路径// 压缩文件夹CompressFolder(sourceDirectory, destinationZipFilePath);Console.WriteLine("文件夹已成功压缩到 " + destinationZipFilePath);}static void CompressFolder(string sourceDir, string zipFilePath){// 创建目标zip文件using (FileStream fsOut = File.Create(zipFilePath))using (ZipOutputStream zipStream = new ZipOutputStream(fsOut)){zipStream.SetLevel(3); // 设置压缩级别(0-9)// 遍历源文件夹中的所有文件和目录int folderOffset = sourceDir.Length + (sourceDir.EndsWith("\\") ? 0 : 1);CompressDirectory(sourceDir, zipStream, folderOffset);}}static void CompressDirectory(string path, ZipOutputStream zipStream, int folderOffset){string[] files = Directory.GetFiles(path);foreach (string filename in files){FileInfo fi = new FileInfo(filename);string entryName = filename.Substring(folderOffset); // 创建条目名entryName = ZipEntry.CleanName(entryName); // 清理名称ZipEntry newEntry = new ZipEntry(entryName);newEntry.DateTime = fi.LastWriteTime; // 设置条目的日期时间newEntry.Size = fi.Length; // 设置条目的大小zipStream.PutNextEntry(newEntry);// 写入文件内容byte[] buffer = new byte[4096];using (FileStream streamReader = File.OpenRead(filename)){StreamUtils.Copy(streamReader, zipStream, buffer);}zipStream.CloseEntry();}// 递归处理目录string[] folders = Directory.GetDirectories(path);foreach (string folder in folders){CompressDirectory(folder, zipStream, folderOffset);}}
}

2.3 解压缩

using System;
using System.IO;
using ICSharpCode.SharpZipLib.Core;
using ICSharpCode.SharpZipLib.Zip;class Program
{static void Main(){string sourceZipFilePath = @"C:\path\to\your\archive.zip"; // 需要解压缩的zip文件路径string destinationDirectory = @"C:\path\to\your\output\folder"; // 解压缩到的目标文件夹路径// 解压缩zip文件ExtractZipFile(sourceZipFilePath, destinationDirectory);Console.WriteLine("文件已成功解压缩到 " + destinationDirectory);}static void ExtractZipFile(string archiveFilenameIn, string outFolder){ZipFile zf = null;try{FileStream fs = File.OpenRead(archiveFilenameIn);zf = new ZipFile(fs);foreach (ZipEntry zipEntry in zf){if (!zipEntry.IsFile){continue; // 忽略目录条目}string entryFileName = zipEntry.Name;string fullZipToPath = Path.Combine(outFolder, entryFileName);string directoryName = Path.GetDirectoryName(fullZipToPath);// 创建目录if (directoryName.Length > 0){Directory.CreateDirectory(directoryName);}byte[] buffer = new byte[4096]; // 4K是推荐的缓冲区大小// 解压缩文件using (Stream zipStream = zf.GetInputStream(zipEntry))using (FileStream streamWriter = File.Create(fullZipToPath)){StreamUtils.Copy(zipStream, streamWriter, buffer);}}}finally{if (zf != null){zf.IsStreamOwner = true; // 使ZipFile也关闭文件流zf.Close();}}}
}

3 压缩效果简单测试

组件压缩等级耗时(ms)结果数据大小(KB)
System.IO.Compression124233360197
535895354376
9137136351221
SharpZipLibNoCompression8561046400
Fastest11571373848
Optimal18642353490
SmallestSize85536351208

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

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

相关文章

一文弄清Java的四大引用及其两大传递

开场白 Hello大家好呀,我是CodeCodeBond✊最近在复习很多很多的基础知识,有了很多新的感悟~ 话不多说,直接发车✈ 四大引用 问题切入点 在学习 Thread线程利用ThreadLocalMap实现线程的本地内存(变量副本)的时候&…

mac配置git的sshkey

在MAC中配置Git的SSH Key: 1.打开终端 2.生成SSH密钥,输入以下命令: ssh-keygen -t rsa -b 4096 -C “你自己的账号电子邮件地址” 按回车键后,系统会提示你输入文件保存路径,默认为~/.ssh/id_rsa直接按回车键使用默…

Mybatis实战:#{} 和 ${}的使用区别和数据库连接池

一.#{} 和 ${} #{} 和 ${} 在MyBatis框架中都是用于SQL语句中参数替换的标记,但它们在使用方式和处理参数值上存在一些显著的区别。 #{}的作用: #{} 是MyBatis中用于预编译SQL语句的参数占位符。它会将参数值放入一个预编译的PreparedStatement中&am…

Java语言程序设计——篇十一(2)

🌿🌿🌿跟随博主脚步,从这里开始→博主主页🌿🌿🌿 欢迎大家:这里是我的学习笔记、总结知识的地方,喜欢的话请三连,有问题可以私信🌳🌳&…

MySQL(8.0)数据库安装和初始化以及管理

1.MySQL下载安装和初始化 1.下载安装包 下载地址:https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar wget https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar 2.解压…

数据同步策略概览

数据同步在业务开发中比较普遍,例如 订阅MySQL的binlog将数据同步至异构数据库。数据同步方案需要考虑一下几点: 数据实时性要求数据量级是否有数据转换逻辑 可分为两种模式 发布订阅模式:分为订阅数据库log还是订阅应用层发的消息点对点模…

问界M7是不是换壳东风ix7? 这下有答案了

文 | AUTO芯 作者 | 谦行 终于真相大白了 黑子们出来挨打啊 问界M7是换壳的东风ix7? 你们没想到,余大嘴会亲自出来正面回应吧 瞧瞧黑子当时乐的 问界你可以啊!靠改名字造车呢? 还有更过分的,说M7是东风小康ix7…

【网络】网络入门(第一篇)

网络入门可以从多个方面开始,以下是一个基本的网络入门指南,涵盖了网络的基本概念、网络类型、网络协议、网络拓扑、网络设备以及网络地址等方面。 一、网络基本概念 计算机网络:将多个计算机系统和设备连接在一起,以实现资源共…

CANoe系统变量模块里定义的结构体类型和变量从CAPL代码角度理解

CAPL里声明一个结构体类型: variables {struct DoIPMessage{byte version;byte inVersion;word type;dword length;byte payload[1500];};struct DoIPMessage doipMessage; }声明一个结构体类型DoIPMessage,定义了一个此结构体…

【数据结构】哈希表(散列表)

目录 1、unordered系列关联式容器 2、哈希概念 3、哈希函数 3.1 直接定址法 3.2 除留余数法 4、哈希冲突 4.1 闭散列(开放定址法) 4.1.1 线性探测 4.1.2 二次探测 4.1.3 线性探测代码实现 插入 搜索 删除 对于不可以取模的类型 4.2 开散列(哈希桶/拉链法) 插入…

【pyhton】Python中zip用法详细解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

在WordPress上启用reCAPTCHA的指南

随着网络安全问题的日益严重,网站管理员必须采取措施保护自己的网站免受恶意攻击。对于WordPress用户来说,可以通过启用谷歌的reCAPTCHA功能来增强网站的安全性。本文将介绍两种在WordPress上启用reCAPTCHA的方法:使用插件和手动添加代码。 一…

白盒测试基础与实践:Python示例及流程图设计

文章目录 前言一、白盒测试是什么?主要特点常用方法优点缺点 二、白盒测试常用技术语句覆盖判定覆盖条件覆盖判定/条件覆盖条件组合覆盖路径覆盖 三、程序流程图设计四、测试用例设计1. 基本路径法2. 语句覆盖3. 判断覆盖4. 条件覆盖5. 判断/条件覆盖6. 条件组合覆盖…

两个好消息,你先听哪个?

1.第五大数据、人工智能与软件工程国际研讨会(ICBASE 2024)成功申请IEEE出版,上线IEEE官网,欢迎投稿参会!!! 📣IEEE独立出版,设置优秀评选 🔥院士加盟,中外高…

一个私有化的中文笔记工具个人知识库,极空间Docker部署中文版『Trilium Notes』

一个私有化的中文笔记工具&个人知识库,极空间Docker部署中文版『Trilium Notes』 哈喽小伙伴们好,我是Stark-C~ 最近被很多小伙伴问到NAS上的笔记工具,虽说之前也出过Memos,刚开始用起来还不错,但是用了一段时间…

(vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束

(vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束 需求:按勾选的顺序给后端传值 难点:在 Element UI 的 el-cascader 组件中,默认的行为是根据数据的层级结构来显示选项,用户的选择也会基于这种层级结构,el-…

文件解析漏洞—IIS解析漏洞—IIS7.X

在IIS7.0和IIS7.5版本下也存在解析漏洞,在默认Fast-CGI开启状况下,在一个文件路径/xx.jpg后面加上/xx.php会将 “/xx.jpg/xx.php” 解析为 php 文件 利用条件 php.ini里的cgi.fix_pathinfo1 开启IIS7在Fast-CGI运行模式下 在 phpstudy2018 根目录创建…

红酒与夜晚:享受静谧的品酒时光

当夜幕低垂,星光点点,世界仿佛进入了一个宁静而神秘的领域。在这样的夜晚,与一瓶定制红酒洒派红酒(Bold & Generous)相伴,便是一场令人陶醉的品酒之旅,让人在静谧中感受生活的美好。 一、夜…

《BiFormer: Vision Transformer with Bi-Level Routing Attention》CVPR2023

摘要 这篇论文提出了一种新型的视觉Transformer,名为BiFormer,它采用了双层路由注意力(Bi-Level Routing Attention, BRA)机制。注意力机制是视觉变换器的核心构建模块,能够捕获数据中的长期依赖性。然而,…

java远程调试

java远程调试 idea2024创一个Spring Web项目springdemo1 使用maven-assembly-plugin插件打包成JAR文件 pom.xml参考如下 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi&quo…