使用zlib库解压文件

下载zlib库源码:http://www.zlib.net/

使用zlib库解压文件_第1张图片

编译lib库

使用zlib库解压文件_第2张图片

选择对应的Visual Studio工程目录打开zlibvc.sln文件,工程设置为Release模式,选中zlibstat项,将预处理器中的ASMINF宏删除(重要否则会产生 L_get_length_code_mmx 的崩溃

使用zlib库解压文件_第3张图片

编译成功后会生成zlibstat.lib库

使用zlib库解压文件_第4张图片

将 zlibstat.lib,zlib.h,zconf.h 拷贝到工程目录,并通过 属性-连接器-输入-附加依赖项 导入zlibstat.lib;

将unzip.h,unzip.c,ioapi.h,ioapi.c拷贝到工程目录,并添加到工程

这几个文件在源码中的位置如图

 

使用zlib库解压文件_第5张图片使用zlib库解压文件_第6张图片

测试工程的设置:

使用zlib库解压文件_第7张图片

核心代码:


#include 
#include 
#include "unzip.h"
#include 

bool unzipCurrentFile(unzFile uf, const char *destFolder)
{
	char szFilePath[512];
	unz_file_info64 FileInfo;

	if (unzGetCurrentFileInfo64(uf, &FileInfo, szFilePath, sizeof(szFilePath), NULL, 0, NULL, 0) != UNZ_OK)
		return false;

	size_t len = strlen(szFilePath);
	if (len <= 0)
	{
		return false;
	}

	std::string fullFileName = destFolder;
	fullFileName = fullFileName + "\\" + szFilePath;
	if (szFilePath[len - 1] == '\\' || szFilePath[len - 1] == '/')
	{
		_mkdir(fullFileName.c_str());
		return true;
	}
	auto file = fopen(fullFileName.c_str(), "wb");

	if (file == nullptr)
	{
		return false;
	}

	const int BUFFER_SIZE = 4096;
	unsigned char byBuffer[BUFFER_SIZE];
	if (unzOpenCurrentFile(uf) != UNZ_OK)
	{
		fclose(file);
		return false;
	}

	while (true)
	{
		int nSize = unzReadCurrentFile(uf, byBuffer, BUFFER_SIZE);

		if (nSize < 0)
		{
			unzCloseCurrentFile(uf);
			fclose(file);
			return false;
		}
		else if (nSize == 0)
		{
			break;
		}
		else
		{
			size_t wSize = fwrite(byBuffer, 1, nSize, file);
			if (wSize != nSize)
			{
				unzCloseCurrentFile(uf);
				fclose(file);
				return false;
			}
		}
	}

	unzCloseCurrentFile(uf);
	fclose(file);
	return true;
}

bool unzipFile(std::string zipFileName, std::string goalPath)
{
	unzFile uf = unzOpen64(zipFileName.c_str());
	if (uf == NULL)
		return false;

	unz_global_info64 gi;
	if (unzGetGlobalInfo64(uf, &gi) != UNZ_OK)
	{
		unzClose(uf);
		return false;
	}

	std::string path=zipFileName;
	auto pos = path.find_last_of("/\\");
	if (pos != std::string::npos)
		path.erase(path.begin() + pos, path.end());

	for (int i = 0; i < gi.number_entry; ++i)
	{
		if (!unzipCurrentFile(uf, goalPath.c_str()))
		{
			unzClose(uf);
			return false;
		}
		if (i < gi.number_entry - 1)
		{
			if (unzGoToNextFile(uf) != UNZ_OK)
			{
				unzClose(uf);
				return false;
			}
		}
	}
	unzClose(uf);
	return true;
}

int main()
{
	unzipFile("test.zip", "C:\\Users\\Administrator\\Desktop\\cc");
	getchar();
	return 0;
}

博友反馈解压的目标目录需要存在

即 C:\\Users\\Administrator\\Desktop\\cc文件夹需要提前创建

你可能感兴趣的:(其他)