https://github.com/zytc2009/BigTeam_learning
分类: 系统运维
2011-05-24 09:55:44
转载:http://blog.csdn.net/yui/archive/2010/07/01/5707842.aspx
libz提供了一套与gzip有关的API,libbz2提供了一套与bzip2有关的API。我们可以利用其中几个常用的函数,在自己的项目中实现压缩、解压缩功能。这两个库文件一般在linux系统中都会有,如果没有,可以分别到以下网址下载其源代码:
gzip:
bzip2:
libz最有用的函数有四个:
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);
追踪其源代码的话,可以发现,gzFile也就是void *
libbz2最有用的函数也有四个:
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);
追踪其源代码的话,可以发现,BZFILE也就是void
所以说,libz的四个函数与libbz2的四个函数,无论从名字上看,还是从参数上看,都是如出一辙的。只不过,gzopen()和gzread()可以打开和读取任何文件,而BZ2_bzopen()和BZ2_bzread()只能打开和读取bzip2压缩的文件。
事实上,它们与普通文件的打开、关闭、读取、写入的四个函数,基本上是对应的:
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);
要打开一个打算读取的二进制文件,三个打开函数的调用分别是:
gzopen("filename", "r");
BZ2_bzopen("filename", "r");
fopen("filename", "rb");
要打开一个打算写入的二进制文件,三个打开函数的调用分别是:
gzopen("filename", "w");
BZ2_bzopen("filename", "w");
fopen("filename", "w");
可以说参数的使用是基本一样的,不过gzopen()和BZ2_bzopen()的mode参数一般没有"rb"而只有"r",因为它们处理的基本上都是二进制文件,不需要特别指明。此外,mode参数还有其它用法,比如制定压缩率等,具体可以查看源代码。
不同的地方之一,FILE是一个关于文件信息的结构体,而不是void类型,之二,gzread()、gzwrite()、BZ2_bzread()和BZ2_bzwrite()的参数位置与fread()和fwrite()不一样,同时也省略了size_of_element参数。
有了这两套API,我们就可以很方便地写出程序对文件进行压缩、解压缩操作,更多的是,把压缩、解压缩功能集成到自己的项目中去,使得项目支持压缩格式。举例如下:
如果要直接使用libz和libbz2,很简单,只需要做到三件事:
1. include头文件。把zlib.h和bzlib.h包含到项目源程序中
2. 链接库文件。如果由于权限问题不能安装库文件,需要在编译时指定库文件的路径
3. 如果库文件没有安装在系统默认的搜索路径,运行前还要修改LD_LIBRARY_PATH环境变量,使得运行时能够找到库文件
值得注意的是,以上列出的只是libz和libbz2里面最常用、比较高级的函数,其实,这两个库文件里还有其它底层的函数,利用这些底层函数,甚至可以解压.Z结尾的压缩文件。具体做法就要慢慢参透libz的全部源代码了。