原帖子:使用minizip解壓縮多個文件(基於zlib)api
寫做目的:以前在網上看到不少人在尋找能夠解壓縮多個文件的程序,其中有嘗試zlib的,使用zlib的源碼能夠生成後綴爲點gz的壓縮文件,可是一次只能壓縮一個文件,沒法壓縮多個文件。其實,zlib的源碼包裏有一個第三方的contrib已經實現解壓縮多個文件,這就是minizip。下面就來看看是怎麼操做的。函數
下載zlib源碼
去zlib網站http://www.zlib.net/,下載源碼並解壓
測試
這裏選擇tar.gz格式的源碼包下載(其它格式均可以)網站
編譯zlib
進入到zlib-1.2.11目錄下,發現有個Makefile文件,打開以下,
加密
這是個提示,讓咱們先運行./configure。按照提示咱們在終端輸入./configure並回車,運行完畢後再打開看Makefile,發現裏面就有內容了,spa
此時在終端輸入make,這樣zlib源碼就開始編譯了。
編譯完畢後若是輸入make install,就能夠把編譯好的zlib庫放在系統路徑裏,之後寫代碼就能夠直接調用zlib提供的庫函數了。
以上這些操做信息是寫在源碼目錄下的readme文件裏的,這裏截取一段,.net
還有講example的,告訴咱們example源碼在哪。3d
源碼目錄下還有個INDEX文件,裏面敘述了構成zlib的全部public header files和private source files,有了這些信息,就能夠很方便的把須要的源碼集成到本身的工程中去。blog
能夠看出做者的文檔寫的很是好。接口
下面就來解決以前說的問題:解壓縮多個文件(基於minizip)。
minizip源碼目錄在zlib-1.2.11/contrib目錄下,進入這個目錄,先看下該目錄下的README.contrib文件,這個文件描述了基於zlib寫的的第三方contributions,找到minizip
有個Makefile,打開以下,
內容比較簡單,就是編譯出2個elf文件:miniunz和minizip。經過名字就能夠知道一個是用來解壓,另外一個用來壓縮。
其中,
輸入make執行Makefile,會有幾個warning,
定位到miniunz.c的100行,
這種條件編譯寫法是比較老的,如今編譯器已經不提倡這種寫法了,因此改成以下,
再編譯就沒這個warning了,按照這種方法也能夠消除minizip.c中97行的warning。最後還剩個mkdir未聲明,通常這是由於沒有對應的頭文件致使的,在終端輸入man 2 mkdir並回車,
能夠看出mkdir對應的是2個頭文件,把這2個頭文件添加到miniunz.c裏,再次編譯,就沒有任何warning了。
編譯完成後,就能夠在minizip目錄下看到2個elf文件:miniunz和minizip。這裏先測試一下minizip,在終端輸入./minizip -h並回車,獲得如下幫助信息,
咱們在minizip目錄下新建一個目錄test,而後把minizip拷貝進去,而後在test目錄下建2個文件a.txt和b.txt,隨意寫點內容在裏面。
而後按照以前的幫助信息,輸入./minizip -o -9 target.zip a.txt b.txt 並回車,能夠發現生成了target.zip文件,打開它發現實現了多個文件的壓縮,
再來測試下miniunz,先把a.txt和b.txt刪除,再把miniunz拷貝進來。先看下miniunz的幫助信息,輸入./miniunz -h並回車,結果竟然有error,說明這個miniunz.c裏的main函數寫的不夠好,沒有對-h的支持,畢竟是第三方contributions
不過不要緊,通常來講-h不行,那麼就直接./miniunz回車,此次幫助信息出來了,
咱們輸入./miniunz -x target.zip,提示解壓成功,咱們看下目錄,確實OK了。
解壓縮多個文件已經測試OK,下面就來測試如下加密解壓縮多個文件,畢竟minizip和miniunz的幫助信息裏顯示是支持加密的。
先測試minizip的加密功能,終端下輸入./minizip -o -9 -p 123 target_crypt.zip 1.txt 2.txt並回車,能夠看到生成了target_crypt.zip文件,雙擊打開它,提示須要輸入密碼,
咱們輸入123,發現能夠正確打開,說明加密功能沒問題。
下面測試一下miniunz的解密功能(先把a.txt和b.txt刪除),終端輸入./miniunz -x -p 123 targer_crypt.zip並回車,發現居然沒法解密,
根據提示,是unzOpenCurrentFilePassword()函數返回了-102,咱們去找一下unzOpenCurrentFilePassword()的定義,回到minizip目錄下使用grep去查找,
發現該函數定義在unzip.c裏,打開unzip.c找到這個函數,
函數開始處就有個可能返回的值UNZ_PARAMERROR,再用grep查下這個宏定義,
發現這個值就是-102,看來函數運行到這個return語句了。再看下代碼,能夠推斷出NOUNCRYPT被定義了,而這個宏從字面感受是沒有密碼的意思,難道miniunz的工程屏蔽瞭解密功能?咱們再用grep查下NOUNCRYPT,看下在哪裏設置的,
能夠看出是在unzip.c裏定義的宏,進去查看下,
果真是定義了NOUNCRYPT,把解密功能屏蔽了。既然找到了問題的根源,那麼解密失敗的問題就迎刃而解了:把這三行語句屏蔽掉,而後從新編譯,從新生成miniunz,並拷貝到test目錄下。再次輸入./miniunz -x -p 123 target_crypt.zip並回車,就能夠了。
看來這個miniunz仍是有點小bug的,不過仔細研究下也很容易解決。
總結
minizip能夠達到解壓縮多個文件的要求,並且其源碼也比較少,結構也簡單清晰,能夠很方便地集成到本身的工程中來,或者本身修改,這就須要本身去研究下源碼了。
若是想偷懶的話,能夠只看minizip.c和miniunz.c裏的main函數,把它改爲一個接口函數,來達到本身的需求。
若是有寫的不對的地方,但願能留言指正,謝謝閱讀。