1.前言

作为吉日嘎拉权限管理系统最早的一批学习版用户,学了不少东西,在群里面也结识了很多朋友,更重要的是闲余时间,大家都发布很多可靠的外包工作。这次也是由于吉日嘎拉发布了一个有关“压缩文件损坏检测”的外包任务,最早在2009年用C#很简单的使用过压缩组件,这次有了这个需求,才所以才深入研究一番,顺便有了这篇博客。

在日常项目开发过程中,操作Zip或者RAR压缩文件也是一件比较常见的事情。主要是打包文件,解压文件等等常规的操作,也相信很多人也用过.NET自带的GZip压缩。今天要给大家介绍的是一些开源的压缩组件的一些简单入门,由于压缩格式很多,效率也不一样,所以开源的东西还是很不错的,支持很全面。

还是老规矩,本文将对这篇文章中提到的相关组件及其源代码,文档或者官方案例打包,统一于3月6日上午11点左右发送,需要的留下邮箱,过期不候。当然,好的文章和资源还需要园友们的支持,如果对你有帮助,不要吝啬鼠标哦,你们的支持就是我原创的动力。

2.关于压缩格式和算法的基础

数据压缩是按照特定的编码机制用比未经编码少的数据比特(或者其它信息相关的单位)表示信息的过程。随着信息技术的高速发展,数据压缩的使用在网络时代越来越重要。对一些特殊的数据如相片、音频、视频的压缩算法也不同。我们今天说的压缩算法都是无损压缩,无损数据压缩指数据经过压缩后,信息不受损失,还能完全恢复到压缩前的原样。“无损”一词是相对于有损数据压缩,有损数据压缩只允许一个近似原始数据进行重建,以换取更好的压缩率。常见的无损压缩算法有LZW、ZIP、RAR、7-Zip等。详细看看几种主流的无损数据压缩格式:

ZIP文件格式是一种流行的数据压缩和文档储存的文件格式,原名Deflate。目前,ZIP格式属于几种主流的压缩格式之一,其竞争者包括RAR格式以及开放源码的7z格式。从性能上比较,RAR及7-Zip格式较ZIP格式压缩率较高,而7-Zip由于提供了免费的压缩工具而逐渐在更多的领域得到应用。该格式开放而且免费,越来越多的软件内嵌支持打开Zip文件。

RAR是一种专利文件格式,用于数据压缩与归档打包,RAR编码器一直是有专利的。所以这也就是为什么我们看到很多开源的压缩软件或者工具能够解压RAR,而不支持RAR打包的原因。RAR通常情况比ZIP压缩比高,但压缩/解压缩速度较慢。

7z是一种可以使用多种压缩算法进行数据压缩的档案格式。该格式最初被7-Zip实现并采用,但是这种档案格式是公有的,并且7-Zip软件本身亦在GNU宽通用公共许可证 (GNU LGPL)协议下开放源代码。7z格式的主要特色有:开源且模块化的组件结构(允许使用任何压缩,转换或加密算法);高压缩比率(使用不同的压缩算法会有不同的结果);支持超大文件;该格式的开发结构允许添加标准以外的压缩算法。

总结:总的来说,我还是比较喜欢7Zip格式,压缩率确实高很多,而且开源。但是如果实际项目由于历史原因等,需要采用Zip或者RAR的,也没办法,还是有很多开源的组件可供选择。

3.几种常见的.NET开源数据压缩组件

3.1 ZIP-DotNetZip

DotNetZip是.NET开源压缩组件中比较早的一个,我在2009年的时候给导师折腾一个小项目,就用到了,所以对其基本操作很熟悉。现在最新版本是1.9.1.8,很久没更新了,也很稳定。网址:http://dotnetzip.codeplex.com/ 。使用DotNetZip,可以很容易的创建、解压以及更新ZIP文件。官网有很多例子,以及介绍,篇幅比较长,就不去翻译了。简单使用,看下一节的使用例子就行了。

3.2 7Zip-SevenZipSharp

SevenZipSharp是.NET下开源的7-Zip格式操作组件,支持所有的7Zip格式。目前最新版本是2010年发布的0.64。由于7Zip的高压缩率以及开源特点,在新项目中使用是最好的选择。网址:http://sevenzipsharp.codeplex.com/ 。它支持的格式比上面多,如:7Zip,RAR,ZIP,Gzip,Cab,LZH等等。注意,除了引用这个组件之外,还需要加7z.dll文件拷贝到bin目录中,因为SevenZipSharp是对7z.dll的一个封装。7z.dll可以在官网http://7-zip.org/下载到,或者看我最后的资料下载,会打包进去的。

3.3 综合-SharpCompress

SharpCompress 也是.NET下开源的压缩文件操作组件。与上面2个不同的是,他支持的格式更多,如RAR,ZIP,Tar,7Zip等等。这个开源项目好像是去年才开始的,在其他几个开源的项目基础上发展而来,也包括了DotNetZipNunrar项目。当然对RAR也只是解压,上面提到了RAR是专利算法,所以不支持创建RAR文件。当然这个还支持很多其他的压缩格式,比如Tar、GZip等等,就不多说了,例子就用我们最常见的ZIP、RAR和7Zip。

3.4 关于调用WINRAR

在处理压缩文件时,还有一种常见的方法,就是使用WINRAR的命令行。网上有很多操作的例子,我也测试过,成功了。但不得不说,灵活性很差。肯定可以满足一小部分人的需求,但我认为这个方法的确不太好。所以在这里就不提倡了,毕竟有现成的更好的东西。为什么说这个WINRAR呢?主要是大家都知道WINRAR是收费的,RAR是专利算法,但其实WINRAR还是提供了免费的程序调用方式,就是UNRAR,在WINRAR的安装文件夹有一个UnrarSrc.txt的说明文件,打开它,里面有地址:www.rarlab.com。需要的自己去看,我找这个东西可花了不少时间,就是因为资料太少,所以也留个脚印吧。

4.基本入门使用教程

4.1 DotNetZip的基本使用

 1 //创建压缩文件
2 using (ZipFile zip = new ZipFile())
3 {
4 //设置密码,也可以为每个文件单独设置密码
5 zip.Password= "123456!";
6 //添加文件
7 zip.AddFile("ReadMe.txt");
8 //添加目录
9 zip.AddDirectory(@"MyDocuments\ProjectX");
10 //设置备注信息
11 zip.Comment = "This is a demo";
12 //还可以设置压缩方式,编码等
13 //保存文件
14 zip.Save("Package.zip");
15 }
16
17 //解压文件
18 using (ZipFile zip = ZipFile.Read("Demo.zip"))
19 { //遍历zip文件中每一个文件对象,然后解压到指定目录
20 foreach (ZipEntry e in zip)
21 {
22 e.Extract(@"C:\test", true);
23 //若有密码,用下面这个方法
24 e.ExtractWithPassword(BaseDirectory, Password);
25 }
26 //也可以通过索引访问文件对象
27 //ZipEntry e = zip["MyReport.doc"];
28 }

当然这只是最简单的压缩和解压Zip文件的操作,还有更多功能可以操作Zip,比如移除文件,通过文件流来压缩和解压缩等等。可以看一下帮助文档,这里只是介绍最基本的功能。因为这次研究这个主要是为了检测错误的Zip文件,所以在这里,留一个疑问给大家:如何判断一个zip文件是否损坏?过一段时间会给大家一个思路,当然不是唯一的解决办法。

4.2 SevenZipSharp基本使用

这里只演示基本的使用,类库还有异常处理、文件流操作等。可以看帮助文档。

 1 //初始化一个压缩器,这个对象一次可以压缩多个文件
2 SevenZipCompressor sc = new SevenZipCompressor();
3 //设置压缩格式,这里是枚举类型,可以选其他的
4 sc.ArchiveFormat = OutArchiveFormat.Zip;
5 //压缩模式,新创建还是追加,若是追加
6 sc.CompressionMode = CompressionMode.Create;
7 //设置压缩算法,也可以不设置,采用默认的
8 //可以使用ZipEncryptionMethod来设置每个文件的密码
9 sc.CompressionMethod = SevenZip.CompressionMethod.Default;
10 //单独压缩文件,CompressFilesEncrypted方法可以设置密码
11 //注意这里的文件路径,要写全称
12 sc.CompressFiles("test.zip", @"C:\X\a.txt", @"C:\X\b.txt");
13 //CompressDirectory 方法单独压缩目录
14 //CompressFileDictionary方法可以压缩文件或者目录,传入一个字典,会自动识别目录或者文件
15
16 //解压缩,可以在初始化的时候设置解压密码
17 SevenZipExtractor se = new SevenZipExtractor("test.zip");
18 foreach (var item in se.ArchiveFileNames)
19 { //逐一解缩
20 se.BeginExtractFiles(@"C:\X", item);
21 }
22 //一次性全部解压
23 // se.BeginExtractArchive(@"C:\X");

4.3 SharpCompress基本使用

SharpCompress是在DotNetZip等开源项目的基础上发展起来的,因此其使用和DotNetZip很类似。这里给一个网址,上面有例子,大家自己去琢磨一下:例子链接

4.总结与资源

总结起来,我觉得DotNetZip使用最灵活,而SevenZipSharp与SharpCompress支持的格式多,而且7zip的压缩率很大,格式开源,使用的场合比较多。RAR格式尽量不要用吧,商业算法,非要使用,一般的类库都可以解压,但压缩可以用上面3.4节提到的UNRAR。可能也还有很多其他的开源组件,不足之处,还请大家指出。

下面是上面几个开源类库的网址以及相关使用资源:

DotNetZip     :http://dotnetzip.codeplex.com/

SevenZipSharp :http://sevenzipsharp.codeplex.com/

SharpCompress:http://sharpcompress.codeplex.com/

C# 压缩组件介绍与入门的更多相关文章

  1. .NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(一)

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑)中,给大家初步介绍了一下FluentValidation验证组件.那里只是概述了一下,并没有对其使用和强大功能做深入研究 ...

  2. NET平台开源项目速览(6)FluentValidation验证组件介绍与入门(转载)

    原文地址:http://www.cnblogs.com/asxinyu/p/dotnet_Opensource_project_FluentValidation_1.html 阅读目录 1.基本介绍 ...

  3. 读写Word的组件DocX介绍与入门

    本文为转载内容: 文章原地址:http://www.cnblogs.com/asxinyu/archive/2013/02/22/2921861.html 开源Word读写组件DocX介绍与入门 阅读 ...

  4. Netty快速入门(08)ByteBuf组件介绍

    前面的内容对netty进行了介绍,写了一个入门例子.作为一个netty的使用者,我们关注更多的还是业务代码.也就是netty中这两种组件: ChannelHandler和ChannelPipeline ...

  5. Netty快速入门(09)channel组件介绍

    书接上回,继续介绍组件. ChannelHandler组件介绍 ChannelHandler组件包含了业务处理核心逻辑,是由用户自定义的内容,开发人员百分之九十的代码都是ChannelHandler. ...

  6. JasperReports入门教程(三):Paramters,Fields和Detail基本组件介绍

    JasperReports入门教程(三):Paramter,Field和Detail基本组件介绍 前言 前两篇博客带领大家进行了入门,做出了第一个例子.也解决了中文打印的问题.大家跟着例子也做出了de ...

  7. [转帖]Druid介绍及入门

    Druid介绍及入门 2018-09-19 19:38:36 拿着核武器的程序员 阅读数 22552更多 分类专栏: Druid   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议 ...

  8. 免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)

    前面介绍了六种.NET组件,其中有一种组件是写文件的压缩和解压,现在介绍另一种文件的解压缩组件SharpZipLib.在这个组件介绍系列中,只为简单的介绍组件的背景和简单的应用,读者在阅读时可以结合官 ...

  9. 最好的.NET开源免费ZIP库DotNetZip(.NET组件介绍之三)

    在项目开发中,除了对数据的展示更多的就是对文件的相关操作,例如文件的创建和删除,以及文件的压缩和解压.文件压缩的好处有很多,主要就是在文件传输的方面,文件压缩的好处就不需要赘述,因为无论是开发者,还是 ...

随机推荐

  1. Manjaro Linux KDE个人的一些安装配置

    安装manjaro kde linux的个人步骤 1 换源 1.1 自动寻找最快的源 sudo pacman-mirrors -i -c China -m rank 1.2 修改源文件 sudo ge ...

  2. 『Python基础-7』for循环 & while循环

    『Python基础-7』for循环 & while循环 目录: 循环语句 for循环 while循环 循环的控制语句: break,continue,pass for...else 和 whi ...

  3. python基础 抽象类(接口类)

    Python中没有接口.接口类,抽象类:定义 制定一个规范 #必须要导入from abc import ABCMeta,abstractmethod class Payment(metaclass = ...

  4. Python学习4——print打印

    print():  在控制台输出变量的值: print打印完后换行: print(123) # 完整模式:print(123,end="\n") 希望打印完不换行: print(1 ...

  5. 《PHP发送邮件PHPMailer》系列分享专栏

    <PHP发送邮件PHPMailer>已整理成PDF文档,点击可直接下载至本地查阅https://www.webfalse.com/read/201726.html 文章 PHPMailer ...

  6. GoLand软件免激活的使用方法

    由于官方的Goland软件,免费使用期限是30天.如果你不购买产品的话,就需要不断的卸载和重装软件才能使用.不过要是您的资金允许的话,可以去http://www.jetbrains.com/go/bu ...

  7. 佛山Uber优步司机奖励政策(7月27日-8月2日)

    周上线时间少于等于7个小时,以下奖励条件无效,仅返还车资.   滴滴快车单单2.5倍,注册地址:http://www.udache.com/如何注册Uber司机(全国版最新最详细注册流程)/月入2万/ ...

  8. 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 9472  Solved: 4344 Desc ...

  9. spark中数据倾斜解决方案

    数据倾斜导致的致命后果: 1 数据倾斜直接会导致一种情况:OOM. 2 运行速度慢,特别慢,非常慢,极端的慢,不可接受的慢. 搞定数据倾斜需要: 1.搞定shuffle 2.搞定业务场景 3 搞定 c ...

  10. 创龙DSP6748学习之RS485收发

    1. 先看下原理图,第一个问题,RS485其实就是使用的串口USART1,同时485的输出脚之间接120欧姆的电阻. 遇到个问题,为什么有两个使能引脚?还有RS485_A和RS485_B为什么分别接上 ...