C++ MiniZip实现目录压缩与解压
Zlib是一个开源的数据压缩库,提供了一种通用的数据压缩和解压缩算法。它最初由Jean-Loup Gailly
和Mark Adler
开发,旨在成为一个高效、轻量级的压缩库,其被广泛应用于许多领域,包括网络通信、文件压缩、数据库系统等。其压缩算法是基于DEFLATE
算法,这是一种无损数据压缩算法,通常能够提供相当高的压缩比。
在Zlib项目中的contrib
目录下有一个minizip
子项目,minizip实际上不是zlib
库的一部分,而是一个独立的开源库,用于处理ZIP压缩文件格式。它提供了对ZIP文件的创建和解压的简单接口。minizip在很多情况下与zlib
一起使用,因为ZIP压缩通常使用了DEFLATE
压缩算法。通过对minizip
库的二次封装则可实现针对目录的压缩与解压功能。
如果你想使用minizip
通常你需要下载并编译它,然后将其链接到你的项目中。
编译Zlib库很简单,解压文件并进入到\zlib-1.3\contrib\vstudio
目录下,根据自己编译器版本选择不同的目录,这里我选择vc12
,进入后打开zlibvc.sln
等待生成即可。
成功后可获得两个文件分别是zlibstat.lib
和zlibwapi.lib
如下图;
接着配置引用目录,这里需要多配置一个minizip
头文件,该头文件是zlib里面的一个子项目。
lib库则需要包含zlibstat.lib
和zlibwapi.lib
这两个文件,此处读者可以自行放入到一个目录下;
ZIP 递归压缩目录
如下所示代码是一个使用zlib库实现的简单文件夹压缩工具的C++程序。该程序提供了压缩文件夹到 ZIP 文件的功能,支持递归地添加文件和子文件夹,利用了 Windows API 和 zlib 库的函数。
|
主要功能
nyCreateZipfromDir函数
bool nyCreateZipfromDir(const std::string& dirpathName, const std::string& zipfileName, const std::string& parentdirName); |
功能:压缩文件夹到指定的 ZIP 文件。
参数:
- dirpathName:源文件夹路径。
- zipfileName:目标 ZIP 文件路径。
- parentdirName:在 ZIP 文件内的文件夹名(如果为空则不指定目录)。
nyCollectfileInDirtoZip 函数
bool nyCollectfileInDirtoZip(zipFile zfile, const std::string& filepath, const std::string& parentdirName); |
功能:递归地收集文件夹中的文件,并将它们添加到已打开的 ZIP 文件中。
参数:
- zfile:已打开的 ZIP 文件。
- filepath:文件夹路径。
- parentdirName:在 ZIP 文件内的相对文件夹名。
nyAddfiletoZip 函数
bool nyAddfiletoZip(zipFile zfile, const std::string& fileNameinZip, const std::string& srcfile); |
功能:将指定文件添加到已打开的 ZIP 文件中。
参数:
- zfile:已打开的 ZIP 文件。
- fileNameinZip:在 ZIP 文件内的相对文件路径。
- srcfile:源文件路径。
程序流程
- 文件夹压缩参数设置: 用户提供源文件夹路径、目标 ZIP 文件路径,以及在 ZIP 文件内的文件夹名。
- ZIP 文件打开: 根据目标 ZIP 文件是否存在,使用 zipOpen 函数打开 ZIP 文件。
- 文件夹递归添加: 使用 nyCollectfileInDirtoZip 函数递归地收集文件夹中的文件,并通过 nyAddfiletoZip 函数将它们添加到 ZIP 文件中。
- ZIP 文件关闭: 使用 zipClose 函数关闭 ZIP 文件。
示例用法
int main(int argc, char* argv[]) |
上述调用代码,参数1指定为需要压缩的文件目录,参数2指定为需要压缩成目录名,参数3为压缩后该目录的名字。
ZIP 递归解压目录
在这个C++程序中,实现了递归解压缩ZIP文件的功能。程序提供了以下主要功能:
- replace_all 函数: 用于替换字符串中的指定子串。
- CreatedMultipleDirectory 函数: 用于创建多级目录,确保解压缩时的目录结构存在。
- UnzipFile 函数: 用于递归解压缩 ZIP 文件。该函数打开 ZIP 文件,获取文件信息,然后逐个解析和处理 ZIP 文件中的文件或目录。
|
主要功能
replace_all 函数
std::string& replace_all(std::string& str, const std::string& old_value, const std::string& new_value) |
功能:在字符串 str 中替换所有的 old_value 为 new_value。
参数:
- str:待处理的字符串。
- old_value:要被替换的子串。
- new_value:替换后的新子串。
返回值:替换后的字符串。
CreatedMultipleDirectory 函数
BOOL CreatedMultipleDirectory(const std::string& direct) |
功能:创建多级目录,确保路径存在。
参数:
- direct:目录路径。
- 返回值:如果成功创建目录返回 TRUE,否则返回 FALSE。
UnzipFile 函数
void UnzipFile(const std::string& strFilePath, const std::string& strTempPath) |
功能:递归解压缩 ZIP 文件。
参数:
- strFilePath:ZIP 文件路径。
- strTempPath:解压到的目标路径。
该函数打开 ZIP 文件,获取文件信息,然后逐个解析和处理 ZIP 文件中的文件或目录。在解析过程中,根据文件或目录的属性,创建相应的目录结构,然后将文件写入目标路径。
示例用法
int main(int argc, char* argv[]) |
案例中,首先在解压缩之前判断传入目录是否存在,如果不存在则需要调用API创建目录,如果存在则直接调用UnzipFIle
解压缩函数,实现解包,输出效果图如下;