转载:https://www.topomel.com/archives/979.html
minizip是一套用来压缩和解压文件的工具,其基于zlib开源代码库。今天来汇总一下使用minzip压缩解压文件的代码片段。
压缩文件
使用minizip压缩文件,我们一般使用如下的几个函数:
zipOpen2_64:新建一个空的Zip文件
zipOpenNewFileInZip3_64:添加一个文件到之前创建好的Zip文件中
zipWriteInFileInZip:读取文件内容并写入到Zip文件
zipCloseFileInZip:关闭当前Zip文件
zipClose: 关闭Zip文件
这里有几个地方需要注意:
1) 在调用zipOpenNewFileInZip3_64在Zip文件中添加文件之前,我们需要计算文件的CRC效验码和文件的时间戳信息,否则,会出现生成的Zip文件解压时头部错误的问题。
2) 读取文件并写入Zip文件过程中,我们需要使用循环的方式,每次对文件读取一定的字节,并注意检查是否到达文件尾(EOF),同时需要检查zipWriteInFileInZip调用是否失败。
伪代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
新建Zip文件(zipOpen2_64)
获取源文件时间戳信息(filetime)
在Zip中创建新文件(zipOpenNewFileInZip3_64)
打开源文件(
fopen
)
do
{
读取源文件一定字节(
fread
)
写入到Zip文件(zipWriteInFileInZip)
}
while
(源文件未到达EOF)
关闭源文件(
fclose
)
关闭Zip当前文件(zipCloseFileInZip)
关闭Zip文件(zipClose)
|
解压Zip文件
在解压一个Zip文件时,我们需要使用的函数如下:
unzOpen64:打开Zip文件
unzGetGlobalInfo64:获取Zip文件的全局信息
unzGetCurrentFileInfo64:获取当前文件信息
unzOpenCurrentFile:打开Zip中的文件
unzReadCurrentFile:读取文件内容
unzCloseCurrentFile:关闭当前文件
unzGoToNextFile:准备读取Zip文件中的下一个文件
unzClose:关闭Zip文件
伪代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
打开Zip文件(unzOpen64)
获取全局信息(unzGetGlobalInfo64)
for
(从全局信息中获取所有Zip文件并遍历)
获取当前文件信息(unzGetCurrentFileInfo64)
if
(当前Zip文件是目录)
创建目录
else
打开Zip文件(unzOpenCurrentFile)
打开目标文件(
fopen
)
while
(Zip文件读取成功)
读取Zip文件(unzReadCurrentFile)
写入目标文件(
fwrite
)
关闭目标文件(
fclose
)
关闭当前Zip文件(unzCloseCurrentFile)
准备处理下一个Zip文件(unzGoToNextFile)
关闭Zip文件(unzClose)
|