目录
1. 下载zlib
2. 编译zlib
3. 使用zlib库解压文件
3.1 准备工作
3.2 使用解压函数对文件进行解压
可以去官网http://www.zlib.net/ 下载zlib
ps:此处运行环境为VS2008+zlib1.2.7
step1:打开VS2008的命令行运行窗口
step2:打开命令行窗口后,进入zlib-1.2.7\contrib\masmx86目录,输入bld_ml32.bat命令,按下回车键运行该命令
PS:由于现在机器基本都是64位,所以一般都是进入masmx64目录,执行bld_ml64.bat。但由于我在Win7和Win10系统环境下执行时出现“ml64.exe不是内部或外部命令,也不是可运行的程序”错误,错误如下图所示,由于操作系统内部会自动将32位软件地址向64位地址对齐,因此在64位机器上使用32位软件没问题!综上,我们这里编译bld_ml32.bat~
step3:进入目录D:\zlib-1.2.7\contrib\vstudio\vc9,由于我使用的是vs2008运行,所以进入的是vc9目录。接着用vs2008打开zlibvc.sln
step4:vs2008打开该文件后,首先要将该项目属性的预处理器设置为win32,然后编译该项目(按一下F5~)
step5:此时D:\zlib-1.2.7\contrib\vstudio\vc9\x86目录下就出现了一个ZlibDllDebug文件夹,装有编译好的dll库和lib
以上zlib库编译完成~
要在项目中使用zlib库解压文件,需要先做一些准备工作~在要使用zlib库的项目文件中新建一个文件夹,这里我命名为zlib,里面的文件有:(由于这里只是使用zlib库解压,所以包含以下文件足以够用)
此时还需要将zlibwapi.dll放到windows/System中,不然运行时会报错~
最后只需在项目代码中加入这两行代码即可~
#include "zlib/unzip.h"
#pragma comment(lib, "zlib/zlibwapi.lib")
以上准备工作完成,接下来可以在代码中使用zlib库的函数对文件进行解压啦~
1)打开压缩文件。利用unzOpen64(char* filePath)函数打开压缩文件,其返回值若为NULL则说明打开压缩文件失败;否则返回打开unzFile类型的变量说明成功打开压缩文件。
2)获取压缩文件的全局消息。利用unzGetGlobalInfo64(unzFile zFile, unz_global_info64 *zGlobalInfo)函数获取压缩文件的全局消息,放到unz_global_info64结构体中,其中有个重要的成员变量——压缩文件内所有文件的数量,但不包括目录。因此可以利用该函数得知压缩文件内的文件数量。
3)循环遍历压缩文件内的所有文件,并将压缩文件解压到本地文件中(其实这就是将读取到的文件写到本地文件中,从而完成解压)。
//遍历所有文件
unz_file_info64 zFileInfo;
unsigned int num = 512;
char *fileName = new char[num];
char *fileData = new char[500*1024];
// zGlobalInfo.number_entry就是获取压缩文件的所有文件数量
for(int i=0; i < zGlobalInfo.number_entry; i++)
{
// 获得压缩文件里的文件(下称为当前压缩文件)信息(其中fileName是全路径名)
if(UNZ_OK != unzGetCurrentFileInfo64(zFile,&zFileInfo,fileName,num,NULL,0,NULL,0))
{
cout<<"得到当前文件信息出错"<
完整解压代码如下:
void unzip(LPCTSTR szSavePath)
{
unzFile zFile;
// Unicode转为ANSI
char filePath[MAX_PATH];
WideCharToMultiByte(CP_ACP, 0, szSavePath, -1, filePath, MAX_PATH, NULL, NULL);
// 打开压缩文件
zFile = unzOpen64(filePath);
if (zFile == NULL)
{
//MessageBox(L"打开压缩文件失败");
return;
}
// 获取压缩文件的全局消息
unz_global_info64 zGlobalInfo;
// 重要成员变量是压缩文件内所有文件的数量(不包括目录)
if (UNZ_OK != unzGetGlobalInfo64(zFile, &zGlobalInfo))
{
//OutputDebugString(__FILE__ + L"中"+__LINE__+L"行错误,得到全局信息出错");
return;
}
// 循环遍历所有文件
unz_file_info64 zFileInfo;
unsigned int num = 512;
char *fileName = new char[num];
char *fileData = new char[500*1024];
for(int i=0; i < zGlobalInfo.number_entry; i++)
{
//遍历所有文件(fileName是全路径名)
if(UNZ_OK != unzGetCurrentFileInfo64(zFile,&zFileInfo,fileName,num,NULL,0,NULL,0))
{
//cout<<"得到当前文件信息出错"<