zlib库编译过程遇到的问题及其使用zlib库进行解压缩

目录

1. 下载zlib

2. 编译zlib

3. 使用zlib库解压文件

    3.1 准备工作

    3.2 使用解压函数对文件进行解压


1. 下载zlib

可以去官网http://www.zlib.net/ 下载zlib

2. 编译zlib

ps:此处运行环境为VS2008+zlib1.2.7

step1:打开VS2008的命令行运行窗口

zlib库编译过程遇到的问题及其使用zlib库进行解压缩_第1张图片

step2:打开命令行窗口后,进入zlib-1.2.7\contrib\masmx86目录,输入bld_ml32.bat命令,按下回车键运行该命令

zlib库编译过程遇到的问题及其使用zlib库进行解压缩_第2张图片出现上述消息说明编译成功。

PS:由于现在机器基本都是64位,所以一般都是进入masmx64目录,执行bld_ml64.bat。但由于我在Win7和Win10系统环境下执行时出现“ml64.exe不是内部或外部命令,也不是可运行的程序”错误,错误如下图所示,由于操作系统内部会自动将32位软件地址向64位地址对齐,因此在64位机器上使用32位软件没问题!综上,我们这里编译bld_ml32.bat~

zlib库编译过程遇到的问题及其使用zlib库进行解压缩_第3张图片

step3:进入目录D:\zlib-1.2.7\contrib\vstudio\vc9,由于我使用的是vs2008运行,所以进入的是vc9目录。接着用vs2008打开zlibvc.sln

zlib库编译过程遇到的问题及其使用zlib库进行解压缩_第4张图片

step4:vs2008打开该文件后,首先要将该项目属性的预处理器设置为win32,然后编译该项目(按一下F5~)

zlib库编译过程遇到的问题及其使用zlib库进行解压缩_第5张图片

zlib库编译过程遇到的问题及其使用zlib库进行解压缩_第6张图片

step5:此时D:\zlib-1.2.7\contrib\vstudio\vc9\x86目录下就出现了一个ZlibDllDebug文件夹,装有编译好的dll库和lib

zlib库编译过程遇到的问题及其使用zlib库进行解压缩_第7张图片

以上zlib库编译完成~


3. 使用zlib库解压文件

3.1 准备工作

要在项目中使用zlib库解压文件,需要先做一些准备工作~在要使用zlib库的项目文件中新建一个文件夹,这里我命名为zlib,里面的文件有:(由于这里只是使用zlib库解压,所以包含以下文件足以够用)

zlib库编译过程遇到的问题及其使用zlib库进行解压缩_第8张图片

此时还需要将zlibwapi.dll放到windows/System中,不然运行时会报错~

zlib库编译过程遇到的问题及其使用zlib库进行解压缩_第9张图片

最后只需在项目代码中加入这两行代码即可~

    #include "zlib/unzip.h"
    #pragma comment(lib, "zlib/zlibwapi.lib") 

以上准备工作完成,接下来可以在代码中使用zlib库的函数对文件进行解压啦~ 

3.2 使用解压函数对文件进行解压

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<<"得到当前文件信息出错"<

 

你可能感兴趣的:(#,解压文件,解压文件,zlib)