7z文件格式及其源碼的分析(二)


這是第二篇, 第一篇在這里: 這一篇開始分析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

 

 

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM