项目笔记---压缩方式

1. 压缩类型的选择

  依据压缩方式的不同,压缩分为有损压缩和无损压缩。其中MP3一类的文件在一定程度的有损压缩下,人的感知不是十分明显而且还是MP3文件的体积相对减小。无损压缩就是类似于ZipRar一类的压缩方式,通过字典保存重复值并以一定的坐标映射方式制定对应的值,例如 重复字符串占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 个文件
15,684,168 字节

115 个文件
23,530,652 字节

压缩后

压缩比

压缩后

压缩比

7-Zip 4.237z 格式)

4621135

100%

6109183

100%

WinRAR 3.50

5021556

109%

6824892

112%

CABARC 5.1

5131393

111%

7434325

122%

WinZip 10.0 betamaximum-PPMd

5277118

114%

8200708

134%

7-Zip 4.23zip 格式)

6222627

135%

8909446

146%

WinZip 10.0 betamaximum-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系统原生支持,但其压缩率并不是很高,如果对压缩率比较敏感建议直接用7Zrar。本人在项目中直接采用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://sparanoid.com/lab/7z/

http://www.cnblogs.com/rentiansheng/archive/2011/09/15/2177716.html

http://dotnetzip.codeplex.com/

 

任何疑问,欢迎回复。

posted @ 2014-09-26 19:00  史蒂芬King  阅读(1284)  评论(2编辑  收藏  举报