使用zlib库将文件或文件夹压缩到zip中的步骤如下:
1. 调用zipOpen()函数,创建一个zipFile对象
2. 调用zipOpenNewFileInZip()函数,在zipFile对象中创建一个文件或文件夹,并将其设为当前文件。若创建的是文件夹,直接执行步骤4;否则执行步骤3
3. 读取被压缩文件的数据,调用zipWriteInFileInZip()函数,将数据写入当前文件中。可进行多次写入
4. 调用zipCloseFileInZip()函数,关闭当前文件
5. 若有多个文件或者文件夹,反复执行步骤2,3,4
6. 将全部数据写入zipFile对象后,调用zipClose()函数来关闭创建的zipFile对象
如此,压缩完成。
相关函数
1. zipFile zipOpen (const char *pathname,int append);
根据传入的文件路径,打开/创建一个zipFile文件。
关于其参数:
① const char *pathname:需要打开/创建的zipFile文件路径
② int append:参数,其取值有以下三种:
#define APPEND_STATUS_CREATE (0) // 创建zipFile文件
#define APPEND_STATUS_CREATEAFTER (1) // ?
#define APPEND_STATUS_ADDINZIP (2) // 在一个zip文件中追加文件
创建zip文件,使用APPEND_STATUS_CREATE。
2.
int zipOpenNewFileInZip( zipFile file, // zip文件
const char* filename, // zip中需要写入的子文件的文件名
const zip_fileinfo* zipfi, // 传入一些包括日期在内的zip补充信息
const void* extrafield_local, // 本子文件扩展信息
uInt size_extrafield_local, // 本子文件扩展信息大小
const void* extrafield_global, // 全局文件扩展信息
uInt size_extrafield_global, // 全局文件扩展信息大小
const char* comment, // 注释
int method, // 压缩方式:0-store,ZDEFLATED-deflate
int level // 压缩等级:[0,9]。详见下面说明
);
在zipFile文件中打开/创建一个新的子文件或文件夹,并将其设为当前文件。
参数filename的结尾是否带有”/”决定了创建的是子文件还是文件夹。
注意,filename需要输入一个相对路径。即认为zip文件开始压缩的第一级目录为根目录,所有的子文件及子文件夹的路径都输入相对于该根目录的路径。
例如:
C:/File/MyFile/
C:/File/MyFile/test.txt
C:/File/TestFile/
要对上面的2个文件夹和一个文件进行压缩,进行压缩的根目录设为C:/File/。
那么,以C:/File/为根目录,3个相对路径为:
MyFile/
MyFile/test.txt
TestFile/
压缩时,将这3个相对路径作为参数传给zipOpenNewFileInZip()。
若传入的相对路径有多级目录,那么zipOpenNewFileInZip ()会自动创建这些目录。
例如,要压缩:
MyFile/
MyFile/test.txt
那么,只需要传入
MyFile/test.txt
MyFile/这个文件夹会被自动创建。
压缩子文件夹相同:
FileA/
FileA/FileB/
FileA/FileB/FileC/
只需要传入
FileA/FileB/FileC/
即可。
3.
int zipOpenNewFileInZip3_64( zipFile file, // zip文件
const char* filename, // zip中需要写入的子文件的文件名
const zip_fileinfo* zipfi, // 传入一些包括日期在内的zip补充信息
const void* extrafield_local, // 本子文件扩展信息
uInt size_extrafield_local, // 本子文件扩展信息大小
const void* extrafield_global, // 全局文件扩展信息
uInt size_extrafield_global, // 全局文件扩展信息大小
const char* comment, // 注释
int method, // 压缩方式:0-store,ZDEFLATED-deflate
int level, // 压缩等级:[0,9]。详见2中详细说明
int raw, // 若raw=1,则写原始文件
int windowBits, // 窗口大小,范围是[8,15]。值越大越好
int memLevel, // 压缩时内存分配等级。越大,压缩越快。范围是[1,9],默认为8
int strategy, // 压缩算法。详见下面说明
const char* password, // 进行加密的密码
uLong crcForCrypting, // crc32校验码
int zip64 // 是否在文件头追加额外信息块
);
关于参数:
① int strategy:压缩算法。其取值可以为:
Z_DEFAULT_STRATEGY:常规数据
Z_FILTERED:由过滤器产生的数据
Z_HUFFMAN_ONLY:Huffman编码数据
Z_RLE:游标编码(run-length encoding)
② int zip64 :若设为1,则在头文件中添加额外信息。如果被压缩文件的原始大小过大,则必须设为1。所谓过大,是指size >=0xffffffff。
4. int zipWriteInFileInZip (zipFile file,constvoid*buf, unsigned len);
向打开的当前子文件中写入数据。
关于其参数:
① zipFile file:已创建的zipFile文件
② constvoid*buf:数据缓存区,被压缩文件的原始二进制数据存放在这里
③ unsigned len:从数据缓存区中读出的字节数
5. int zipCloseFileInZip (zipFile file);
关闭当前打开的子文件/文件夹。
6. int zipClose (zipFile file,const char* global_comment);
关闭zipFile文件,压缩完成。
const char* global_comment设为NULL即可。