项目笔记---压缩方式
1. 压缩类型的选择
依据压缩方式的不同,压缩分为有损压缩和无损压缩。其中MP3一类的文件在一定程度的有损压缩下,人的感知不是十分明显而且还是MP3文件的体积相对减小。无损压缩就是类似于Zip,Rar一类的压缩方式,通过字典保存重复值并以一定的坐标映射方式制定对应的值,例如 重复字符串占20位,而映射的字符串仅仅占2位,这样就达到了压缩的目的,压缩率就是要看重复值出现的概率。这仅仅是压缩的一种方式,还有许多专门针对特定文件的压缩算法。
2. 7z压缩
7-Zip 是一款 开源 软件。大多数源代码都基于 GNU LGPL 许可协议下发布。AES 代码基于 BSD 许可下发布。unRAR 代码基于两种许可:GNU LGPL 和 unRAR 限制许可。更多下许可信息请查看:7-Zip 许可。
您可以在任何一台计算机上使用 7-Zip ,包括用在商业用途的计算机,不对 7-Zip 进行捐赠或支付并不影响您的使用。
让我们把 7-Zip 和常用的压缩软件进行比较。
软件名称 |
Mozilla Firefox |
Google Earth |
||
161 个文件 |
115 个文件 |
|||
压缩后 |
压缩比 |
压缩后 |
压缩比 |
|
7-Zip 4.23(7z 格式) |
4621135 |
100% |
6109183 |
100% |
WinRAR 3.50 |
5021556 |
109% |
6824892 |
112% |
CABARC 5.1 |
5131393 |
111% |
7434325 |
122% |
WinZip 10.0 beta(maximum-PPMd) |
5277118 |
114% |
8200708 |
134% |
7-Zip 4.23(zip 格式) |
6222627 |
135% |
8909446 |
146% |
WinZip 10.0 beta(maximum-portable) |
6448666 |
140% |
9153898 |
150% |
压缩比结果由被压缩的数据大小而定。通常使用 7-Zip 的 7z 格式能比使用 zip 格式的压缩档案小 30-70%。并且使用 7-Zip 创建的 zip 格式比大多数其它压缩软件创建的都小 2-10%。
C# 实现方式可参考 http://www.cnblogs.com/rentiansheng/archive/2011/09/15/2177716.html
其中是用的C#调用外部程序的方式,所以没有添加DLL,直接调用的Exe文件。
3. Zip压缩
Zip压缩被Windows系统原生支持,但其压缩率并不是很高,如果对压缩率比较敏感建议直接用7Z或rar。本人在项目中直接采用Zip的方式,利用开源控件实现压缩功能。
DoNetZip(http://dotnetzip.codeplex.com/) 相对比C#自带的Zip压缩类和其他开源方式好用些,这也是选择开源的原因。官网还有API文档基本很全面,但是略微有些过时,貌似是更新不及时,仅供大家参考。
代码很简单:
/// <summary> /// Compress /// </summary> /// <param name="files"></param> /// <param name="zipFullName"></param> public static void Compress(List<string> files, string zipFullName) { //if (!System.IO.Directory.Exists(folderPath)) //{ // throw new Exception("The directory does not exist!\n"); //} //if (System.IO.File.Exists(folderPath + "\\" + zipName)) //{ // throw new Exception("That zipfile already exists!\n"); //}
// 以上注释掉的部分为检测是否文件已存在,因为如下代码会覆盖保存。
using (ZipFile zip = new ZipFile()) { zip.Comment = System.DateTime.Now.ToString("G"); zip.AlternateEncoding = System.Text.Encoding.UTF8; zip.AlternateEncodingUsage = ZipOption.Always; zip.AddFiles(files, ""); // Add to root path, if not ,it should replace by "Template". zip.Save(zipFullName); } } /// <summary> /// Decompress /// </summary> /// <param name="folderPath"></param> /// <param name="zipName"></param> public static void Decompress(string folderPath, string zipName) { using (ZipFile zip = new ZipFile(folderPath + "\\" + zipName)) { zip.AlternateEncoding = System.Text.Encoding.UTF8; zip.AlternateEncodingUsage = ZipOption.Always; zip.ExtractAll(folderPath, ExtractExistingFileAction.OverwriteSilently); } }
说明:
zip.AlternateEncoding = System.Text.Encoding.UTF8; // 如果想启用编码方式,则两条语句必须都添加,就像必须先打开开关一样,然后再调节亮度。
zip.AlternateEncodingUsage = ZipOption.Always;
Reference
http://www.baike.com/wiki/%E5%8E%8B%E7%BC%A9
http://www.cnblogs.com/rentiansheng/archive/2011/09/15/2177716.html
http://dotnetzip.codeplex.com/
任何疑问,欢迎回复。
作者:Stephen Cui
出处:http://www.cnblogs.com/cuiyansong
版权声明:文章属于本人及博客园共有,凡是没有标注[转载]的,请在文章末尾加入我的博客地址。
如果您觉得文章写的还不错,请点击“推荐一下”,谢谢。