The power of C, the power of MD

A problem is a chance to do your best
posts - 11, comments - 22, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

使用libz和libbz2的API在项目中集成gzip和bzip2功能

Posted on 2010-07-30 12:22 roy 阅读(2805) 评论(0)  编辑 收藏 引用 所属分类: C/C++

libz提供了一套与gzip有关的API,libbz2提供了一套与bzip2有关的API。我们可以利用其中几个常用的函数,在自己的项目中实现压缩、解压缩功能。这两个库文件一般在linux系统中都会有,如果没有,可以分别到以下网址下载其源代码:

 

gzip: http://www.gzip.org/

bzip2: http://www.bzip.org/index.html

 

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,我们就可以很方便地写出程序对文件进行压缩、解压缩操作,更多的是,把压缩、解压缩功能集成到自己的项目中去,使得项目支持压缩格式。举例如下:

 

  1. 如果使用libz的API,压缩就是对源文件进行fopen()/fread()/fclose()操作,对目标文件进行gzopen()/gzwrite()/gzclose()操作;解压缩就是对源文件进行gzopen()/gzread()/gzclose()操作,对目标文件进行fopen()/fwrite()/fclose()操作
  2. 如果使用libbz2的API,压缩就是对源文件进行fopen()/fread()/fclose()操作,对目标文件进行BZ2_bzopen()/BZ2_bzwrite()/BZ2_bzclose()操作;解压缩就是对源文件进行BZ2_bzopen()/BZ2_bzread()/BZ2_bzclose()操作,对目标文件进行fopen()/fwrite()/fclose()操作

 

如果要直接使用libz和libbz2,很简单,只需要做到三件事:

1.     include头文件。把zlib.h和bzlib.h包含到项目源程序中

2.     链接库文件。如果由于权限问题不能安装库文件,需要在编译时指定库文件的路径

3.     如果库文件没有安装在系统默认的搜索路径,运行前还要修改LD_LIBRARY_PATH环境变量,使得运行时能够找到库文件

 

值得注意的是,以上列出的只是libz和libbz2里面最常用、比较高级的函数,其实,这两个库文件里还有其它底层的函数,利用这些底层函数,甚至可以解压.Z结尾的压缩文件。具体做法就要慢慢参透libz的全部源代码了。

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/yui/archive/2010/07/01/5707842.aspx


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理