这是第二篇, 第一篇在这里: 这一篇开始分析7z的源码结构.

一. 准备工作:

1. 源码下载:

可以从官方中文主页下载:http://sparanoid.com/lab/7z/.  为了方便, 这里直接给出下载链接: http://downloads.sourceforge.net/sevenzip/7z920.tar.bz2 . 

2. 工具准备:

源码中给的工程文件都是vc6.0的工程.  作者说他不喜欢新vs的界面. 哎.  不过没关系, 我们使用VS2008也一样可以. 有极少地方需要修改一下.  我们使用VS2008 sp1 作为开发环境.

二. HelloWorld:

我们在根目录下新建一个目录"7z", 把源码都解压到这个位置.

我们稍后再详细解释这些目录的意思.   先来一个helloworld, 程序员的最爱.

请直接打开这个路径: 7z\CPP\7zip\Bundles\Alone\

用vs打开其中的 Alone.dsw 文件.   提示要转换工程文件. 点击同意.   然后编译这个工程. 如果不出意外的话, 应该提示你编译成功了.

这个时候, 打开 c:\util\  目录.  里面已经生成7za.exe.    注意, 这里是C盘的绝对路径 :  c:\UTIL\7za.exe

好了, 这个7za.exe  就是一个包含全部7z功能的压缩,解压命令行工具了.

我们可以从命令行进入该目录. 输入 7za.exe 回车. 就能看到它的帮助信息啦.

我们先拷贝一个文件到这个目录, 比如拷贝一个test.txt 到c:\util\ 里面去.  我们用命令行来压缩它.

==============

c:\util>7za.exe  a  test.7z  test.txt

==============

这个命令把test.txt  压缩成test.7z.   这两个文件名都是可以带路径的,  为了方便, 我们都拷贝到当前目录了.

恩, 我们再来试试解压.

==============

c:\util>7za.exe x  test.7z  -oout

==============

这个命令可以吧test.7z 解压到当前的out目录下.

试试这两个命令吧, 是不是还不错.

三, 目录结构详解:

我们先回到最外层目录:

7z源码基本上是按文件类型分类的.

1.  上面的ASM目录, 其中保存汇编代码.  为了极限的性能, 7z使用了部分汇编代码, crc计算, 和aes加密.  这两点都不是必须的, 实际上, 它们都有c语言的实现. 7z会检测, 如果cpu提供了硬件的aes指令, 就会使用硬件aes汇编指令, 而不会使用自己的aes函数.

2. "C" 目录是7z的核心.   实际上, 7z所有的核心算法都是用c语言实现的. 包括所有的压缩算法, 以及我们的主角7z打包算法.   这些c代码非常强悍, 部分代码可以跨平台编译, 甚至能在嵌入式平台上编译.

 (a)  这里面有几个工程文件值得我们注意, 找到这个位置: 7z\C\Util\7z

我们来编译它. 它会在debug目录下生成  7zdec.exe

这是一个最小化的指包含7z解压器的独立exe程序.  有了它就可以解压文件了.

(b) 找到这个目录,  7z\C\Util\Lzma

编译之后也会在绝对目录生成.   c:\util\7lzma.exe.  这是一个lzma压缩算法的工具.  只能压缩或解压单个文件. 只包含lzma算法.

这可以用来测试lzma算法.

(c) 打开这个目录 7z\C\Util\LzmaLib.

这个工程用来生成 只包含lzma算法的 dll.  以便你的程序调用lzma算法.

3. "CPP" 目录是也是7z的重点.

前面说了核心的算法都在C目录下面.  那么CPP目录是做什么的呢.   除了核心的算法之外, 7z还有非常丰富的外围功能.  就是他的文件管理器, 以及右键菜单支持等等. 这些与UI和系统相关的功能都是用c++实现的.     此外, C中的核心算法在cpp目录中都有c++的面向对象的封装.  我们来逐一介绍它的子目录:

a ) "Windows" 目录.

其中包含了与windows集成的功能. 包括菜单集成, 剪贴板支持, 文件io,等等.

b) "Common" 目录.

通用的工具类.

c ) 我们重点介绍 7zip 目录:

(1) "Archive" 目录. 包含各种 archive ("打包") 算法的代码.   因为7z不光支持7z文件,  还支持zip, rar, chm等等其他的打包文件格式.   

这里面每个目录就是一种格式.   7z目录当然就是我们的主角7z格式了. ( 这里面的代码是对C文件夹里面的代码的c++封装. )  这里面有一个工程文件.

打开这个工程文件, 然后在工程上面点右键,查看属性:

可以看到, 它的输出路径是: C:\Program Files\7-zip\Formats\7z.dll

这是什么意思呢?   对,  这个工程就是封装7z格式的dll.  这个工程的目的就是给我们演示如何让7z支持我们的自定义格式.   具体怎么实现自定义格式, 可以参考这个工程以及 它周围的其他文件夹格式, 比如:Cab, Chm, 等等. 实现相应的com接口, 然后编译到这个目录下, 7z就能自动调用了.  以后有时间我们再详细介绍这个.

(2) 再来看 "Bundles" 目录.

这里面的Alone目录, 我们在前面 写 helloworld 的时候已经见识过了. 它是一个包含全部7z功能的console 的exe.

其中我们再介绍另一个重要的目录,  就是Format7zF.

打开它, 编译,  会提示几个链接错误.  原因是因为作者使用的是vc6. 和我们使用的vs2008一些编译选项不支持了.

分别在这几个汇编文件上点击右键:

找到"CommandLine" 参数, 把其中的参数删除:  -omf -WX -W3,  只保留 -c

然后再编译就会成功了.

编译完成之后, 它会在绝对目录下生成一个dll.  C:\Program Files\7-Zip\7z.dll

这个dll是做什么的呢?

它是包含7z全部功能的dll.   第三方的程序可以调用这个dll实现7z的所有功能.   包括7z自己本身的文件管理器 都是通过这种方式调用的.

好了, 基本上 7z源码的主要目录都介绍完了.  大家有什么疑问可以留言交流.

我们之后的讲解都将使用: 7z\CPP\7zip\Bundles\Alone 这个目录下的工程配合命令行参数来调试讲解. 因为这是一个包含7z全部功能的console程序, 简单好调试.

如果你不想了解7z的文件结构,  只是想在你的程序中集成进处理7z文件的功能. 那么已经足够了.  可以打开上面介绍的相应工程,  把源码集成到你的工程中, 或者直接调用: 7z\CPP\7zip\Bundles\Format7zF 生成的dll. 都是不错的选择.

下一节开始, 我们将开始讲解7z的文件格式结构了.  完成以后, 我会把地址更新到这里.

欢迎大家访问我的独立博客交流讨论. http://byNeil.com

7z文件格式及其源码的分析(二)的更多相关文章

  1. 7z文件格式及其源码的分析(四)

    这是7z文件格式及其源码的分析系列的第四篇. 上一篇讲到了7z文件静态结构的尾header部分.这一篇开始,将从7z实际压缩流程开始详细介绍7z文件尾header的详细结构. 一, 第一个概念: co ...

  2. 7z文件格式及其源码的分析

    7z文件格式及其源码的分析 本文是一个系列. 主要是分享我最近一年做7z文件开发的经验. 主要包括7z官方源码的结构分析, 以及7z文件格式的分析. 其中涉及到7z源码结构的各个细节, 以及7z文件格 ...

  3. 7z文件格式及其源码的分析(五)

    这是7z文件格式及其源码的分析系列的第五篇. 上一篇讲到了7z文件压缩流程.最近太忙了,好久没更新,都快忘了写到哪了.:) 这一篇就说说7z文件的尾头的生成方式吧. 上一篇已经讲了尾header的结构 ...

  4. 7z文件格式及其源码的分析(三)

    上一篇在这里.  这是7z文件格式分析的第三篇, 相信有了前两篇的准备,你已经了解了7z源码的大致结构, 以及如何简单调试7z的源码了. 很多同学是不是迫不及待想要拔去7z的神秘外衣,看看究竟了. 好 ...

  5. 7z文件格式及其源码linux/windows编译

    7z文件格式及其源码的分析(二) 一. 准备工作: 1. 源码下载: 可以从官方中文主页下载:http://sparanoid.com/lab/7z/. 为了方便, 这里直接给出下载链接: http: ...

  6. 7z文件格式及其源码

    7z文件格式及其源码的分析(四) 这是7z文件格式及其源码的分析系列的第四篇. 上一篇讲到了7z文件静态结构的尾header部分.这一篇开始,将从7z实际压缩流程开始详细介绍7z文件尾header的详 ...

  7. Spring5源码深度分析(二)之理解@Conditional,@Import注解

    代码地址: 1.源码分析二主要分析的内容 1.使用@Condition多条件注册bean对象2.@Import注解快速注入第三方bean对象3.@EnableXXXX 开启原理4.基于ImportBe ...

  8. Backbone.js 1.0.0源码架构分析(二)——Event

    (function(){ //省略前面代码 var Events = Backbone.Events = { // 根据name订阅事件,push到this._events[name] on: fun ...

  9. wireshark源码分析二

    一.源代码结构 在wireshark源代码根目录下,可以看到以下子目录: 1)物理结构     其中,epan文件夹负责所有网络协议识别工作,plugins里面存放了wireshark所有插件,gtk ...

随机推荐

  1. Python小知识点(2)

    1.简述Python的运行过程 在说这个问题之前,我们先来说两个概念,PyCodeObject和pyc文件. 我们在硬盘上看到的pyc自然不必多说,而其实PyCodeObject则是Python编译器 ...

  2. 【311】Python 构建 ArcMap 标注表达式

    参考:构建标注表达式(官方帮助) 参考:计算字段示例(官方帮助) 说明:以上两者的方法略有不同,一个是通过字段表达式显示标注,一个通过字段计算新的字段,使用的工具方法也不同,前者通过 Layer.la ...

  3. shell编程——变量子串的常用操作

    ${#字符串} 返回字符串的长度 [root@localhost ~]# a=length [root@localhost ~]# echo ${#a} 6 ${字符串:位置x} 从位置x开始往后截取 ...

  4. C#发送和接受POST请求

    1.发送Post请求代码 /// <summary> /// 发起Http请求 /// </summary> /// <param name="flightDa ...

  5. java算法 蓝桥杯 文化之旅

    问题描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能有相同的文化.不同文化 ...

  6. gvim

    [gvim] 1.gvim的配置文件在安装目录下,文件名为_vimrc. 2.通过以下命令选择配色方案:

  7. 【POJ1284】Primitive Roots

    [题目大意] 给你一个素数n,求n的原根个数. [题解] 关于原根有一个定理: 定理:如果模有原根,那么它一共有个原根. 所以这题就是求phi[phi[n]] 很简单吧...(如果知道这个定理的话) ...

  8. Hibernate事务代码规范写法

    ----------------siwuxie095 事务相关概念 1.什么是事务 逻辑上的一组操作,构成这组操作的各个单元,要么一起成功, 要么一起失败 2.事务的四个特性 1)原子性 2)一致性 ...

  9. 使用 XML-RPC 为 C++ 应用程序启用 Web 服务

    http://www.ibm.com/developerworks/cn/webservices/ws-xml-rpc/ 引言 Internet 现在的受欢迎程度越来越高,由于这个原因及其固有的优势, ...

  10. ECC 算法

    一.简介 1)椭圆曲线密码学的初级读本 http://8btc.com/thread-1240-1-1.html 2)ECC加密算法入门介绍 http://www.pediy.com/kssd/ped ...