爲 7-Zip 寫一個存檔格式插件 (1):7-Zip 簡介

7-Zip 簡介

最近閒着沒事,出於探索(折騰)精神,就想搞個大新聞。想來想去,就拿 7-Zip 下手吧。正好我手頭有一個自定義格式的文件包操做庫,但一直懶得寫一個圖形管理工具,能直接讓 7z 支持這個格式豈不美哉?git

本文不會深刻介紹 7z 的運行流程,畢竟我也是頗有針對性的閱讀代碼,僅僅閱讀了與存檔包格式處理相關的代碼,更深刻的我也沒讀下去,之後再說吧。另外我也不想寫太多,這個系列就寫到可以讀取存檔包(只讀)爲止,寫入和修改部分歡迎你們本身研究。web

先給想要閱讀 7z 代碼的朋友提個醒,7z 這個代碼。。對外接口部分的文檔確實是比較充分了,可是若是想添加新的格式,或者添加新的壓縮算法,這部分代碼註釋不多,你必須本身完整閱讀先後文代碼,本身分析運行流程,而後祈禱本身分析的沒有誤差。算法

7-Zip 官網:https://7-zip.org/服務器

7z 沒有官方 git 倉庫,雖然是開源的,但源碼是以 7z 壓縮包的形式提供的,看不到修改提交記錄就很難受。源碼是以 LGPL 協議開源的,想要改完代碼閉源發佈的請當心了。函數

7z 的功能其實分爲 3 個部分:Format、Codec、Hasher,顧名思義,就是文件格式、壓縮算法、哈希(校驗)算法。完整的功能列表能夠執行 7z i 命令,看到長長的格式列表了麼,官方說支持 30 多種格式的解壓。工具

對於以前沒有深刻使用過壓縮文件處理工具的讀者,這裏順便科普一下。咱們說的壓縮文件,其實分爲兩部分:壓縮算法(Compress)和存檔包格式(Archive)。性能

壓縮算法是輸入一段數據,輸出壓縮後的數據,注意這裏沒有文件和文件夾的概念,僅僅是處理一段數據。咱們常見的壓縮算法如 deflate、lzma。網頁開發的同窗應該都知道 deflate(gzip),web 服務器必開的一個選項了吧,網頁數據傳輸不牽扯任何文件格式,僅僅是把數據流壓縮發送出去。加密

存檔包定義了文件和文件夾的存儲方式,它是一種打包格式,打包的能夠是一個文件,也能夠是多個文件,其中還會包含其餘信息,如哈希值、時間戳、文件權限、註釋等。gzip 工具就是對 deflate 壓縮算法的簡單封裝,只支持單個文件壓縮解壓。tar 存檔包格式就是一種純打包的格式,把多個文件或文件夾打包成一個單獨的文件,它自己不具有任何壓縮功能。咱們常見的 .tar.gz 格式就是先打包成 tar,再用 gzip 進行壓縮。spa

源碼結構

解壓 7z 源碼後,能夠看到這 4 個文件夾。命令行

clipboard.png

7z 的大部分代碼都是 C++ 寫的,少部分須要高性能的代碼是 C 寫的,最最核心的幾個壓縮算法函數,是彙編寫的。DOC 目錄中有 7z 格式的介紹,和源碼各個目錄的簡介,看看就好。

從源碼中大量的 .mak 文件就能夠看出,官方應該是直接經過 nmake 工具在命令行中編譯的。但也提供了 VS 項目文件,在 CPP/7zip/BundlesCPP/7zip/UI 目錄下。

咱們重點關注 Bundles 目錄下的這 2 個項目:

  • Alone:編譯出獨立版本的 7za.exe,僅支持 7z 等少數幾種常見格式的命令行工具
  • Format7zF:編譯出 7z.dll,這纔是 7z 的核心,裏面包含全部支持的格式

按照慣例,都是先把 Alone 項目編譯一遍,但須要注意,項目默認輸出目標是 C:\UTIL\7za.exe,是寫死的路徑,最好本身到 項目屬性->連接器->輸出文件 中改改。若是編譯出現資源重複錯誤,把 Spec/resource.rc 文件從項目中移除便可。

源碼的核心都在 CPP\7zip 目錄下:

  • Archive 目錄是全部支持的存檔包格式
  • Compress 是壓縮算法
  • Crypto 是加密算法
  • UI 目錄下的幾個項目是官方安裝包裏的幾個 exe

既然咱們的目標是讓 7z 支持更多的存檔包格式,那麼就只關注 Archive 目錄,照葫蘆畫瓢搞出其餘格式不就好了。

哈哈,固然沒這麼簡單的,下一篇文接着講遍及源碼各處的重要接口。

相關文章
相關標籤/搜索