使用libz和libbz2的API在項(xiàng)目中集成gzip和bzip2功能
Posted on 2010-07-30 12:22 roy 閱讀(3025) 評(píng)論(0) 編輯 收藏 引用 所屬分類: C/C++libz提供了一套與gzip有關(guān)的API,libbz2提供了一套與bzip2有關(guān)的API。我們可以利用其中幾個(gè)常用的函數(shù),在自己的項(xiàng)目中實(shí)現(xiàn)壓縮、解壓縮功能。這兩個(gè)庫文件一般在linux系統(tǒng)中都會(huì)有,如果沒有,可以分別到以下網(wǎng)址下載其源代碼:
gzip: http://www.gzip.org/
bzip2: http://www.bzip.org/index.html
libz最有用的函數(shù)有四個(gè):
gzFile gzopen(const char *path, const char *mode);
int gzclose(gzFile file);
int gzread(gzFile file, void *buf, unsigned len);
int gzwrite(gzFile file, const void *buf, unsigned len);
追蹤其源代碼的話,可以發(fā)現(xiàn),gzFile也就是void *
libbz2最有用的函數(shù)也有四個(gè):
BZFILE *BZ2_bzopen(const char *path, const char *mode);
void BZ2_bzclose(BZFILE *file);
int BZ2_bzread(BZFILE *file, void *buf, int len);
int BZ2_bzwrite(BZFILE *file, void *buf, int len);
追蹤其源代碼的話,可以發(fā)現(xiàn),BZFILE也就是void
所以說,libz的四個(gè)函數(shù)與libbz2的四個(gè)函數(shù),無論從名字上看,還是從參數(shù)上看,都是如出一轍的。只不過,gzopen()和gzread()可以打開和讀取任何文件,而BZ2_bzopen()和BZ2_bzread()只能打開和讀取bzip2壓縮的文件。
事實(shí)上,它們與普通文件的打開、關(guān)閉、讀取、寫入的四個(gè)函數(shù),基本上是對(duì)應(yīng)的:
FILE *fopen(const char *path, const char *mode);
int fclose(FILE *fp);
int fread(void *buf, int size_of_element, int len, FILE *fp);
int fwrite(void *buf, int size_of_element, int len, FILE *fp);
要打開一個(gè)打算讀取的二進(jìn)制文件,三個(gè)打開函數(shù)的調(diào)用分別是:
gzopen("filename", "r");
BZ2_bzopen("filename", "r");
fopen("filename", "rb");
要打開一個(gè)打算寫入的二進(jìn)制文件,三個(gè)打開函數(shù)的調(diào)用分別是:
gzopen("filename", "w");
BZ2_bzopen("filename", "w");
fopen("filename", "w");
可以說參數(shù)的使用是基本一樣的,不過gzopen()和BZ2_bzopen()的mode參數(shù)一般沒有"rb"而只有"r",因?yàn)樗鼈兲幚淼幕旧隙际嵌M(jìn)制文件,不需要特別指明。此外,mode參數(shù)還有其它用法,比如制定壓縮率等,具體可以查看源代碼。
不同的地方之一,F(xiàn)ILE是一個(gè)關(guān)于文件信息的結(jié)構(gòu)體,而不是void類型,之二,gzread()、gzwrite()、BZ2_bzread()和BZ2_bzwrite()的參數(shù)位置與fread()和fwrite()不一樣,同時(shí)也省略了size_of_element參數(shù)。
有了這兩套API,我們就可以很方便地寫出程序?qū)ξ募M(jìn)行壓縮、解壓縮操作,更多的是,把壓縮、解壓縮功能集成到自己的項(xiàng)目中去,使得項(xiàng)目支持壓縮格式。舉例如下:
- 如果使用libz的API,壓縮就是對(duì)源文件進(jìn)行fopen()/fread()/fclose()操作,對(duì)目標(biāo)文件進(jìn)行g(shù)zopen()/gzwrite()/gzclose()操作;解壓縮就是對(duì)源文件進(jìn)行g(shù)zopen()/gzread()/gzclose()操作,對(duì)目標(biāo)文件進(jìn)行fopen()/fwrite()/fclose()操作
- 如果使用libbz2的API,壓縮就是對(duì)源文件進(jìn)行fopen()/fread()/fclose()操作,對(duì)目標(biāo)文件進(jìn)行BZ2_bzopen()/BZ2_bzwrite()/BZ2_bzclose()操作;解壓縮就是對(duì)源文件進(jìn)行BZ2_bzopen()/BZ2_bzread()/BZ2_bzclose()操作,對(duì)目標(biāo)文件進(jìn)行fopen()/fwrite()/fclose()操作
如果要直接使用libz和libbz2,很簡單,只需要做到三件事:
1. include頭文件。把zlib.h和bzlib.h包含到項(xiàng)目源程序中
2. 鏈接庫文件。如果由于權(quán)限問題不能安裝庫文件,需要在編譯時(shí)指定庫文件的路徑
3. 如果庫文件沒有安裝在系統(tǒng)默認(rèn)的搜索路徑,運(yùn)行前還要修改LD_LIBRARY_PATH環(huán)境變量,使得運(yùn)行時(shí)能夠找到庫文件
值得注意的是,以上列出的只是libz和libbz2里面最常用、比較高級(jí)的函數(shù),其實(shí),這兩個(gè)庫文件里還有其它底層的函數(shù),利用這些底層函數(shù),甚至可以解壓.Z結(jié)尾的壓縮文件。具體做法就要慢慢參透libz的全部源代碼了。
本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/yui/archive/2010/07/01/5707842.aspx