下载zlib库,zlib-1.2.13\contrib\minizip下的minizlib支持文件夹的压缩解压缩。
使用CMake生成zlib库解决方案,编译时将minizlib中的几个文件:zip.h,.c;unzip.h,.c;ioapi.h,.c;iowin32.h放到静态库工程中(我只需要静态库),统一编成静态库。
注意:因为是需要外部调用,需要配置解决方案的一些宏定义,否则编译过了外面也没法用。就是把ZEXPORT给设置成导出就好。而且有两个宏(ZEXPORT和ZEXTERN)可以控制,可能冲突,注意只能放开ZEXPORT,我在编译过程中还把这个宏给删掉了一些,不多,5.6个,否则编译不过。
下面是从其他地方拷贝的代码,并解决了不支持中文路径和名称的问题。不过查找所有文件*.*这块还是不太好,只能指定类型。
//将文件添加到zip文件中,注意如果源文件srcFile为空则添加空目录
//fileNameInZip: 在zip文件中的文件名,包含相对路径
void AddFileToZip(zipFile zf, CString fileNameInZip, CString srcFile)
{
FILE* srcfp = NULL;
//初始化写入zip的文件信息
//zip_fileinfo zi;
zip_fileinfo zi = { 0 };
zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
zi.dosDate = 0;
zi.internal_fa = 0;
zi.external_fa = 0;
//如果srcFile为空,加入空目录
string new_file_name = "";
new_file_name += fileNameInZip;
if (srcFile == "")
{
new_file_name += "/";
}
//在zip文件中创建新文件
zipOpenNewFileInZip(zf, new_file_name.c_str(), &zi, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION);
if (srcFile != "")
{
//打开源文件
fopen_s(&srcfp, srcFile, "rb");
if (srcfp == NULL)
{
printf("无法添加文件: %s !\n", srcFile);
zipCloseFileInZip(zf); //关闭zip文件
return;
}
//读入源文件并写入zip文件
char buf[100 * 1024]; //buffer
int numBytes = 0;
while (!feof(srcfp))
{
numBytes = fread(buf, 1, sizeof(buf), srcfp);
zipWriteInFileInZip(zf, buf, numBytes);
if (ferror(srcfp))
break;
}