当前位置: 首页 > article >正文

SharpCompress实战:一个方法搞定C#里ZIP压缩打包,附赠RAR/7Z解压和TAR.GZ创建教程

C#压缩解压全能手册用SharpCompress玩转ZIP/RAR/7Z/TAR.GZ在开发日志管理系统、文件上传模块或数据备份工具时文件压缩解压功能就像空气一样不可或缺。但面对ZIP、RAR、7Z、TAR.GZ这些格式各异的压缩包不少开发者都会陷入API选择的困境。SharpCompress这个轻量级库用统一的API设计让我们能用几乎相同的代码风格处理所有主流压缩格式。1. 环境准备与核心概念在Visual Studio中新建一个控制台项目通过NuGet添加SharpCompress只需两步右键点击项目选择管理NuGet程序包搜索框中输入SharpCompress并安装最新稳定版SharpCompress支持六种存档格式和九种压缩类型但需要注意几个关键特性格式类型压缩支持解压支持典型应用场景ZIP✔✔通用文件打包RAR✘✔解压用户上传文件7Z✘✔高压缩率场景TAR.GZ✔✔Linux系统备份TAR.BZ2✔✔大文件分卷压缩提示RAR格式由于专利限制SharpCompress仅支持解压。如需压缩RAR需要考虑调用WinRAR命令行工具。2. ZIP文件全流程操作ZIP作为最通用的压缩格式SharpCompress提供了完整的支持。假设我们要将日志目录打包成ZIP并上传// 压缩日志目录 var logPath C:\Logs\2023; var zipPath C:\Upload\logs_2023.zip; using (var zipStream File.Create(zipPath)) using (var writer WriterFactory.Open(zipStream, ArchiveType.Zip, CompressionType.Deflate)) { writer.WriteAll(logPath, *.*, SearchOption.AllDirectories); Console.WriteLine($ZIP压缩完成大小{new FileInfo(zipPath).Length / 1024}KB); } // 解压ZIP示例 var extractPath D:\ExtractedLogs; using (var archive ArchiveFactory.Open(zipPath)) { foreach (var entry in archive.Entries.Where(e !e.IsDirectory)) { entry.WriteToDirectory(extractPath, new ExtractionOptions { ExtractFullPath true, Overwrite true }); Console.WriteLine($解压: {entry.Key}); } }这段代码演示了几个实用技巧SearchOption.AllDirectories参数实现递归目录压缩使用Where过滤掉目录条目只处理文件通过ExtractionOptions控制解压行为3. 处理仅解压格式RAR和7Z当用户上传RAR或7Z格式时我们可以用几乎相同的模式处理// RAR解压通用方法 void ExtractRar7z(string archivePath, string outputDir) { using (var stream File.OpenRead(archivePath)) using (var reader ReaderFactory.Open(stream)) { while (reader.MoveToNextEntry()) { if (!reader.Entry.IsDirectory) { Console.WriteLine($正在解压: {reader.Entry.Key}); reader.WriteEntryToDirectory(outputDir, new ExtractionOptions { ExtractFullPath true, Overwrite true }); } } } } // 使用示例 ExtractRar7z(C:\Upload\user_data.rar, D:\UserData); ExtractRar7z(E:\Backup\project.7z, D:\ProjectBackup);注意几个常见问题处理中文文件名乱码设置ExtractionOptions的Encoding属性密码保护压缩包使用ReaderOptions的Password参数大文件内存优化通过Entry的OpenEntryStream()流式处理4. Linux友好格式TAR.GZ实战在跨平台场景下TAR.GZ是更优选择。下面是创建增量备份的示例void CreateIncrementalBackup(string sourceDir, string backupPath, DateTime lastBackupTime) { using (var tarStream File.Create(backupPath)) using (var writer WriterFactory.Open(tarStream, ArchiveType.Tar, CompressionType.GZip)) { var files Directory.GetFiles(sourceDir, *, SearchOption.AllDirectories) .Where(f File.GetLastWriteTime(f) lastBackupTime); foreach (var file in files) { var relativePath file.Substring(sourceDir.Length); writer.Write(relativePath, file); Console.WriteLine($已添加: {relativePath}); } } } // 使用示例 var lastBackup new DateTime(2023, 6, 1); CreateIncrementalBackup(C:\Website, D:\Backup\wwwroot_20230615.tar.gz, lastBackup);对于数据库备份等场景可以结合BZip2获得更高压缩率using (var stream File.Create(D:\Backup\db_20230615.tar.bz2)) using (var writer WriterFactory.Open(stream, ArchiveType.Tar, CompressionType.BZip2)) { writer.Write(dump.sql, C:\Temp\mysql_dump.sql); }5. 高级技巧与性能优化处理大文件时内存管理尤为关键。以下是几个实战建议流式处理大文件using (var archive ArchiveFactory.Open(largeZipPath)) { var bigFileEntry archive.Entries.First(e e.Key.EndsWith(.iso)); using (var entryStream bigFileEntry.OpenEntryStream()) using (var fileStream File.Create(D:\LargeFiles\output.iso)) { entryStream.CopyTo(fileStream); // 分块传输避免内存溢出 } }多线程压缩优化Parallel.ForEach(Directory.GetFiles(sourceDir), file { var entryName Path.GetFileName(file); lock (zipWriter) { zipWriter.Write(entryName, file); } });异常处理模板try { using (var archive ArchiveFactory.Open(corruptZipPath)) { // 处理条目 } } catch (InvalidFormatException ex) { Console.WriteLine($文件损坏: {ex.Message}); File.Move(corruptZipPath, corruptZipPath .invalid); } catch (CryptographicException ex) { Console.WriteLine($需要密码: {ex.Message}); // 弹出密码输入对话框 }实际项目中我发现对超过2GB的文件使用WriteEntryToDirectory可能会遇到内存问题。这时改用OpenEntryStream配合FileStream写入会更可靠特别是在IIS等托管环境中。

相关文章:

SharpCompress实战:一个方法搞定C#里ZIP压缩打包,附赠RAR/7Z解压和TAR.GZ创建教程

C#压缩解压全能手册:用SharpCompress玩转ZIP/RAR/7Z/TAR.GZ 在开发日志管理系统、文件上传模块或数据备份工具时,文件压缩解压功能就像空气一样不可或缺。但面对ZIP、RAR、7Z、TAR.GZ这些格式各异的压缩包,不少开发者都会陷入API选择的困境。…...

告别Selenium!用DrissionPage的ChromiumPage和SessionPage,5分钟搞定登录与爬虫

告别Selenium!用DrissionPage的ChromiumPage和SessionPage,5分钟搞定登录与爬虫 在Python自动化测试和爬虫开发领域,Selenium曾经是无可争议的王者。但随着时间的推移,开发者们逐渐意识到Selenium的局限性——复杂的配置、缓慢的执…...

别再只跑仿真了!用Vivado 2023.1给你的FPGA图像处理项目做个“硬件体检”

从仿真到硬件的跨越:FPGA图像处理项目实战验证指南 在实验室里看着仿真波形完美无缺,却在开发板上遭遇各种"灵异事件"——这可能是每个FPGA开发者都经历过的成长仪式。仿真环境就像飞行模拟器,能教会你基本操作,但真正的…...

软件测试中的bug管理:高效定位、跟踪与修复全流程解析

在软件测试全生命周期中,bug管理是保障产品质量、提升开发效率的核心环节。从bug的精准定位到全流程跟踪,再到最终的有效修复,每一个步骤都需要专业的方法、工具与团队协作。对于软件测试从业者而言,掌握科学的bug管理体系&#x…...

我用豆包写的论文 AI 率为什么 95%?这款工具一次降到 4% 万方检测合格

我用豆包写的论文 AI 率为什么 95%?这款工具一次降到 4% 万方检测合格 去年我用豆包写了 1 万字的生物学本科论文——自己读着挺顺、像人写的。送学校万方 AIGC 检测——AI 率 95.7%,学校卡的是 30%。我整个人懵了。 这篇文章我把当时的实测过程写下来—…...

理解“变异”的奥秘——集中趋势与变异性度量详解

如果说统计学是在“用数据讲故事”,那么集中趋势回答的是:“这个故事大概讲到了哪里?”而变异性回答的是:“这个故事有多分散、多不稳定、多不一样?”很多初学者学统计时,最先记住的是“平均数”“中位数”…...

基于Adafruit CRICKIT与3D打印的水面机器人DIY全攻略

1. 项目概述:打造你的第一艘智能水面机器人 如果你对机器人、水上航行或者水下摄影感兴趣,但又觉得从零开始设计电路和结构太复杂,那么这个项目就是为你准备的。今天,我想分享一个我最近完成的、非常有趣且实用的创客项目&#x…...

MPC-BE:为什么这款开源播放器能成为Windows多媒体播放的终极解决方案?

MPC-BE:为什么这款开源播放器能成为Windows多媒体播放的终极解决方案? 【免费下载链接】MPC-BE MPC-BE – универсальный проигрыватель аудио и видеофайлов для операционной систем…...

PlotSquared完整指南:5分钟掌握Minecraft领地管理神器 [特殊字符]

PlotSquared完整指南:5分钟掌握Minecraft领地管理神器 🎮 【免费下载链接】PlotSquared PlotSquared - Reinventing the plotworld 项目地址: https://gitcode.com/gh_mirrors/pl/PlotSquared PlotSquared是一个革命性的Minecraft领地管理插件&am…...

从硬件电路深入理解计算机中断机制:8088到现代中断控制器

1. 项目概述:从硬件视角重新认识中断在计算机的世界里,中断(Interrupt)是一个既基础又至关重要的概念。它就像是程序世界里的“紧急呼叫”系统,允许CPU这个“大管家”在埋头处理日常事务(执行主程序&#x…...

Perplexity Pro高阶用法深度解密:结合Obsidian/Notion实现知识自动蒸馏的完整链路(含可复用JSON Schema)

更多请点击: https://intelliparadigm.com 第一章:Perplexity Pro高阶用法深度解密:结合Obsidian/Notion实现知识自动蒸馏的完整链路(含可复用JSON Schema) Perplexity Pro 的 API 提供了结构化响应能力,配…...

数字孪生是什么?它在数字化转型中的关键角色是什么?

数字孪生的定义与应用现状 数字孪生技术利用实时映射物理实体到虚拟空间,为各类行业提供了无缝的连接与监控。例如,在制造行业,数字孪生可以模拟生产线,帮助企业快速识别瓶颈,提高效率。在城市管理方面,城市…...

OpenClaw 2.7.5 Windows 一键部署教程|零配置开箱即用

前言 本地 AI 智能体技术持续迭代,私有化部署、数据安全可控、低门槛快速落地,已成为用户选型的核心考量。开源轻量化 AI 智能体 OpenClaw 2.7.5 版本完成全面优化升级,在环境适配性、服务稳定性与模型集成能力上均有显著提升,原…...

Artisan烘焙软件:基于Python的开源咖啡烘焙控制与数据分析平台

Artisan烘焙软件:基于Python的开源咖啡烘焙控制与数据分析平台 【免费下载链接】artisan artisan: the worlds most trusted roasting software 项目地址: https://gitcode.com/gh_mirrors/ar/artisan Artisan是一款采用Python技术栈构建的开源咖啡烘焙控制软…...

QuickLookVideo:让Mac上的视频文件管理变得轻松直观

QuickLookVideo:让Mac上的视频文件管理变得轻松直观 【免费下载链接】QuickLookVideo This package allows macOS Finder to display thumbnails, static QuickLook previews, cover art and metadata for most types of video files. 项目地址: https://gitcode.…...

OBS高级遮罩插件:15种专业遮罩技术的完整技术解析与实战应用

OBS高级遮罩插件:15种专业遮罩技术的完整技术解析与实战应用 【免费下载链接】obs-advanced-masks Advanced Masking Plugin for OBS 项目地址: https://gitcode.com/gh_mirrors/ob/obs-advanced-masks 在视频制作与直播领域,遮罩技术是区分业余与…...

5分钟解锁虚拟多屏生产力:Rust驱动打造Windows虚拟显示器终极方案

5分钟解锁虚拟多屏生产力:Rust驱动打造Windows虚拟显示器终极方案 【免费下载链接】virtual-display-rs A Windows virtual display driver to add multiple virtual monitors to your PC! For Win10. Works with VR, obs, streaming software, etc 项目地址: htt…...

盘点6款优质客户销售管理系统:全业务打通到垂直场景适配

前言在数字化转型的深水区,企业对于管理工具的需求已从单一的工具辅助转向全链路的业务协同。面对市场上纷繁复杂的SaaS产品,如何基于“客户信息管理、销售机会管理、表单流程、数据统计、移动端端支持、自动化、权限安全、系统集成”八大核心维度进行精…...

别再只盯着动态功耗了!聊聊CMOS电路中那个‘静悄悄’的静态功耗(以反相器为例)

别再只盯着动态功耗了!聊聊CMOS电路中那个‘静悄悄’的静态功耗(以反相器为例) 在低功耗芯片设计领域,工程师们常常将注意力集中在动态功耗的优化上——时钟网络的精简、门控时钟的引入、电压域的划分,这些技术确实能显…...

告别‘涂抹感’:深入浅出聊聊Chromatix ISP里ABF模块的‘边缘保留’与‘噪声消除’如何平衡

告别‘涂抹感’:深入浅出聊聊Chromatix ISP里ABF模块的‘边缘保留’与‘噪声消除’如何平衡 在手机摄影普及的今天,我们常常会遇到这样的困扰:夜间拍摄的照片要么噪点明显,要么经过降噪处理后变得模糊不清,丢失了细节…...

Flowable 6.7.2 适配达梦数据库踩坑实录:从驱动到Liquibase源码修改全攻略

Flowable 6.7.2 深度适配达梦数据库实战指南:从驱动配置到源码级改造 在国产化替代浪潮中,数据库迁移往往是技术团队面临的首要挑战。当工作流引擎Flowable遇上国产数据库达梦(DM),两者的"语言不通"会导致一系列兼容性问题。本文将…...

从QRegExp迁移到QRegularExpression避坑全记录:我们项目踩过的雷和最佳实践

从QRegExp迁移到QRegularExpression避坑全记录:我们项目踩过的雷和最佳实践 当团队决定将代码库从Qt4/Qt5升级到Qt6时,正则表达式模块的迁移往往是最容易被低估的挑战之一。我们项目组在重构过程中,曾因QRegExp到QRegularExpression的语法差异…...

用STM32G431RBT6复刻一个简易示波器+信号发生器:蓝桥杯嵌入式外设综合应用实战

基于STM32G431RBT6的嵌入式示波器与信号发生器开发实战 在嵌入式系统开发领域,将理论知识转化为实际应用能力是每个工程师成长的必经之路。本文将带你使用STM32G431RBT6开发板,从零开始构建一个兼具示波器和信号发生器功能的综合系统。这个项目不仅能够…...

CircuitJS1:如何在浏览器中免费创建电子电路仿真

CircuitJS1:如何在浏览器中免费创建电子电路仿真 【免费下载链接】circuitjs1 Electronic Circuit Simulator in the Browser 项目地址: https://gitcode.com/gh_mirrors/ci/circuitjs1 CircuitJS1是一款强大的开源电子电路仿真工具,让你直接在浏…...

考研数学避坑指南:那些课本不讲但真题爱考的极限与无穷小细节

考研数学避坑指南:那些课本不讲但真题爱考的极限与无穷小细节 考研数学中,极限与无穷小的概念看似基础,却暗藏玄机。每年都有大量考生在看似简单的题目上失分,原因往往是对这些概念的深层理解不足。本文将聚焦真题中最常见的陷阱&…...

能力本位招聘:打破学历地域限制,聚焦实战技能与远程协作

1. 项目概述:一次非典型的团队组建实验最近,我身边不少朋友和读者都在讨论一个挺有意思的招聘启事,标题就是“朱老师研发团队招人了!学历学校不限,地域不限!”。这和我们平时在招聘网站上看到的那些要求“9…...

Adobe-GenP 3.0:5分钟解锁Adobe全家桶的专业方案

Adobe-GenP 3.0:5分钟解锁Adobe全家桶的专业方案 【免费下载链接】Adobe-GenP Adobe CC 2019/2020/2021/2022/2023 GenP Universal Patch 3.0 项目地址: https://gitcode.com/gh_mirrors/ad/Adobe-GenP 还在为高昂的Adobe订阅费用发愁吗?Adobe-Ge…...

在自动化测试场景中利用Taotoken实现多模型API调用与成本控制

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 在自动化测试场景中利用Taotoken实现多模型API调用与成本控制 对于工程团队而言,自动化测试是保障软件质量的关键环节。…...

手把手教你用Spark MLlib搞定协同过滤:从ItemCF到UserCF的保姆级代码解析

Spark MLlib实战:从协同过滤到深度学习推荐系统的全链路实现 推荐系统作为机器学习领域最具商业价值的应用之一,其核心算法在Spark生态中有着丰富的实现。本文将带您深入Spark MLlib的推荐算法实践,从经典的协同过滤到前沿的深度学习模型&…...

告别手写UI!用VSCode+QtDesigner+PyQt5,5分钟搞定你的第一个Python图形界面

5分钟极速构建Python GUI:VSCodeQtDesignerPyQt5全流程实战 每次看到同事用代码逐行构建UI界面时,总忍不住想起自己初学时的痛苦经历——调整一个按钮位置要反复运行程序,修改边距像素值就像在玩"猜数字"游戏。直到发现QtDesigner这…...