Zip压缩解压缩之C++实现。

2023-10-30

压缩:可压缩单一文件,也可压缩文件夹里的多个文件(包括文件夹里面的子文件夹)。压缩的目标文件格式无限制:demo文件使用的是.text,.h,.cpp,.png,.bmp,.wav,.mp4等。
解压缩:非覆盖解压缩。
1、codeproject下载地址:http://www.codeproject.com/KB/files/zip_utils.aspx
如果无法访问,请移驾下载:
https://pan.baidu.com/s/1kZ5_dtUHpSY7PP1z50Z0cA
提取码:tnqc
下载zip库,得到四个文件:zip.h,zip.cpp,unzip.h,unzip.cpp,添加进工程。
2、编译出现错误提示。
在这里插入图片描述
解决方法:选中两个源文件右键-属性-配置属性-C/C+±预编译头-不使用预编译头
编译成功。
在这里插入图片描述
3、添加压缩类ZipHelper。
3.1关键成员声明。

/*
ZipHelper.h
*/
#pragma once
#include <iostream>
#include<vector>
using namespace std;
#include "./zlib/zip.h"
#include "./zlib/unzip.h"

class ZipHelper
{
public:
	ZipHelper();
	~ZipHelper();

private:
	HZIP m_hz;				 //Zip文件句柄 
	ZRESULT m_zr;			 //操作返回值 
	ZIPENTRY m_ze;			 //Zip文件入口

	CString m_FolderPath;	 //folder路径 
	CString  m_FolderName;   //folder将要被压缩的文件夹名

	int m_nZipCnt;
private:
	//实现遍历文件夹 
	void BrowseFile(CString &strFile);

	//获取相对路径 
	void GetRelativePath(CString& pFullPath, CString& pSubString);

	//创建路径 
	BOOL CreatedMultipleDirectory(wchar_t* direct);

	//压缩解压缩接口 
	BOOL Zip_PackFiles(vector<CString> arr, CString mZipFileFullPath);

	BOOL Zip_UnPackFiles(CString mZipFileFullPath, CString mUnPackPath);

	//检查文件(夹)存在
	BOOL IsFolderExist(CString& strPath);

	BOOL IsFileExist(CString& strPath);
public:
	void PressFolder(CString strTgt,CString strSrcFolder = "", vector<CString> arrSrcFloder = {});//指定压缩包  单一路径 路径集合
	
	void UnPressFolder(CString strTgt);//指定解压目标
private:
	vector<CString>  m_arrFileFullName;
};

3.2成员函数实现。

#include "stdafx.h"
#include "ZipHelper.h"

ZipHelper::ZipHelper()
{
	m_nZipCnt = 0;
}

ZipHelper::~ZipHelper()
{
}

BOOL ZipHelper::Zip_PackFiles(vector<CString> arr, CString mZipFileFullPath)
{
	for (int i = 0; i < arr.size(); ++i)
	{
		//参数错误 
		if ((arr[i] == "") || (mZipFileFullPath == ""))
		{
			//路径异常返回 
			return FALSE;
		}

		if (!IsFolderExist(arr[i]) && !IsFileExist(arr[i]))
		{
			//要被压缩的文件夹不存在 
			return FALSE;
		}

		CString tZipFilePath = mZipFileFullPath.Left(mZipFileFullPath.ReverseFind('\\') + 1);
		if (!IsFolderExist(tZipFilePath))
		{
			//ZIP文件存放的文件夹不存在创建它 
			wchar_t* temp = (wchar_t*)tZipFilePath.GetBuffer(tZipFilePath.GetLength());
			if (FALSE == CreatedMultipleDirectory(temp))
			{
				//创建目录失败 
				return FALSE;
			}
		}

		//获得文件夹的名字 
		if (arr[i].Right(1) == '\\')
		{
			this->m_FolderPath = arr[i].Left(arr[i].GetLength() - 1);
			m_FolderName = m_FolderPath.Right(m_FolderPath.GetLength() - m_FolderPath.ReverseFind('\\') - 1);
		}
		else
		{
			this->m_FolderPath = arr[i];
			m_FolderName = arr[i].Right(arr[i].GetLength() - arr[i].ReverseFind('\\') - 1);
		}

		/************************************************************************/

		//创建ZIP文件 
		if (m_nZipCnt == 0)
		{
			m_hz = CreateZip(mZipFileFullPath, 0);
		}

		if (m_hz == 0)
		{
			//创建Zip文件失败 
			return FALSE;
		}

		//递归文件夹,将获取的文件加入ZIP文件 
		m_nZipCnt++;
		BrowseFile(arr[i]);
		//关闭ZIP文件 
		if (m_nZipCnt == m_arrFileFullName.size())
		{
			CloseZip(m_hz);
			m_nZipCnt = 0;
			break;
		}
	}

	/************************************************************************/

	CFileFind tFFind;
	if (!tFFind.FindFile(mZipFileFullPath))
	{
		//压缩失败(未发现压缩后的文件) 
		return FALSE;
	}

	return TRUE;
}

/ 
// 函数说明: 解压缩文件夹 
// 参数说明: [in]: mUnPackPath     解压后文件存放的路径 
//                         mZipFileFullPath  ZIP文件的路径
/ 
BOOL ZipHelper::Zip_UnPackFiles(CString mZipFileFullPath, CString mUnPackPath)
{
	//参数错误 
	if ((mUnPackPath == "") || (mZipFileFullPath == ""))
	{
		//路径异常返回 
		return FALSE;
	}

	CFileFind tFFind;
	if (!tFFind.FindFile(mZipFileFullPath))
	{
		//压缩失败(未发现压缩文件) 
		return FALSE;
	}

	//如果解压缩的路径不存在 试图创建它 
	CString tZipFilePath = mUnPackPath;
	if (!IsFolderExist(tZipFilePath))
	{
		//解压后存放的文件夹不存在 创建它 
		wchar_t* temp = (wchar_t*)tZipFilePath.GetBuffer(tZipFilePath.GetLength());
		if (FALSE == CreatedMultipleDirectory(temp))
		{
			//创建目录失败 
			return FALSE;
		}
	}
	/************************************************************************/
	//打开ZIP文件 
	m_hz = OpenZip(mZipFileFullPath, 0);
	if (m_hz == 0)
	{
		//打开Zip文件失败 
		return FALSE;
	}

	m_zr = SetUnzipBaseDir(m_hz, mUnPackPath);
	if (m_zr != ZR_OK)
	{
		//打开Zip文件失败 
		CloseZip(m_hz);
		return FALSE;
	}

	m_zr = GetZipItem(m_hz, -1, &m_ze);
	if (m_zr != ZR_OK)
	{
		//获取Zip文件内容失败 
		CloseZip(m_hz);
		return FALSE;
	}

	int numitems = m_ze.index;
	for (int i = 0; i < numitems; i++)
	{
		m_zr = GetZipItem(m_hz, i, &m_ze);
		m_zr = UnzipItem(m_hz, i, m_ze.name);

		if (i == 100)
		{
			int x = 1;
		}
		if (m_zr != ZR_OK)
		{
			//获取Zip文件内容失败 
			CloseZip(m_hz);
			return FALSE;
		}
	}

	m_nZipCnt = 0;
	CloseZip(m_hz);
	return TRUE;
}

/ 
// 函数说明: 遍历文件夹 
// 参数说明: [in]:strFile 遍历的文件夹(此方法会主动向路径末尾添加*.*) 
// 返回值:BOOL类型,存在返回TRUE,否则为FALSE 
/ 
void ZipHelper::BrowseFile(CString &strFile)
{
	CFileFind ff;
	CString szDir = strFile;

	WIN32_FIND_DATAA FindFileData;
	FindFirstFile(strFile, &FindFileData);
	if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//Folder
	{
		if (szDir.Right(1) != "\\")
			szDir += "\\";
		szDir += "*.*";
	}
	else//File
	{
		int xx = 21;
	}

	BOOL res = ff.FindFile(szDir);
	while (res)
	{
		res = ff.FindNextFile();
		if (ff.IsDirectory() && !ff.IsDots())
		{
			//如果是一个子目录,用递归继续往深一层找 
			CString strPath = ff.GetFilePath();

			CString subPath;
			GetRelativePath(strPath, subPath);
			//将文件添加到ZIP文件 
			ZipAddFolder(m_hz, subPath);
			BrowseFile(strPath);
		}
		else if (!ff.IsDirectory() && !ff.IsDots())
		{
			//显示当前访问的文件(完整路径) 
			CString strPath = ff.GetFilePath();
			CString subPath;

			GetRelativePath(strPath, subPath);
			//将文件添加到ZIP文件 
			ZipAdd(m_hz, subPath, strPath);
		}
	}
	//关闭 
	ff.Close();
}

/ 
// 函数说明: 获取相对路径 
// 参数说明: [in]:pFullPath 当前文件的完整路径 [out] : 解析后的相对路径 
/ 
void ZipHelper::GetRelativePath(CString& pFullPath, CString& pSubString)
{
	pSubString = pFullPath.Right(pFullPath.GetLength() - GetAppPath().GetLength());
}

/ 
// 函数说明: 创建多级目录 
// 参数说明: [in]: 路径字符串 
// 返回值: BOOL 成功True 失败False 
/ 
BOOL ZipHelper::CreatedMultipleDirectory(wchar_t* direct)
{
	std::wstring Directoryname = direct;

	if (Directoryname[Directoryname.length() - 1] != '\\')
	{
		Directoryname.append(1, '\\');
	}
	std::vector< std::wstring> vpath;
	std::wstring strtemp;
	BOOL  bSuccess = FALSE;
	for (int i = 0; i < Directoryname.length(); i++)
	{
		if (Directoryname[i] != '\\')
		{
			strtemp.append(1, Directoryname[i]);
		}
		else
		{
			vpath.push_back(strtemp);
			strtemp.append(1, '\\');
		}
	}
	vector< std::wstring>::const_iterator vIter = vpath.begin();
	for (vIter; vIter != vpath.end(); vIter++)
	{
		bSuccess = CreateDirectory((LPCTSTR)vIter->c_str(), NULL) ? TRUE : FALSE;
	}

	return bSuccess;
}

/ 
// 函数说明: 检查指定的文件夹是否存在 
// 参数说明: [in]:strPath 检查的文件夹 (此方法会主动向路径末尾添加*.*) 
// 返回值:BOOL类型,存在返回TRUE,否则为FALSE 
/ 
BOOL ZipHelper::IsFolderExist(CString& strPath)
{
	CString sCheckPath = strPath;

	if (sCheckPath.Right(1) != '\\')
		sCheckPath += '\\';

	sCheckPath += "*.*";

	WIN32_FIND_DATA wfd;
	BOOL rValue = FALSE;
	HANDLE hFind = FindFirstFile(sCheckPath, &wfd);

	if ((hFind != INVALID_HANDLE_VALUE) &&
		(wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) || (wfd.dwFileAttributes&FILE_ATTRIBUTE_ARCHIVE))
	{
		//如果存在并类型是文件夹 
		rValue = TRUE;
	}

	FindClose(hFind);
	return rValue;
}
BOOL ZipHelper::IsFileExist(CString& strPath)
{
	DWORD dwAttrib = GetFileAttributes(strPath);
	return INVALID_FILE_ATTRIBUTES != dwAttrib && 0 == (dwAttrib & FILE_ATTRIBUTE_DIRECTORY);
}
void ZipHelper::PressFolder(CString strTgt, CString strSrcFolder, vector<CString> arrSrcFloder)
{
	m_arrFileFullName.clear();

	if (!strSrcFolder.IsEmpty())
	{
		m_arrFileFullName.push_back(strSrcFolder);
	}
	if (!arrSrcFloder.empty())
	{
		for (auto it : arrSrcFloder)
		{
			m_arrFileFullName.push_back(it);
		}
	}
	
	//目的文件夹
	string patm_hzipFile = strTgt;
	Zip_PackFiles(m_arrFileFullName, patm_hzipFile.c_str());
}


void ZipHelper::UnPressFolder(CString strTgt)
{
	if (strTgt.IsEmpty())
		return;

	string patm_hzipFile = strTgt;
	string mUnPackPath = GetAppPath();

	Zip_UnPackFiles(patm_hzipFile.c_str(), mUnPackPath.c_str());
}

4、压缩、解压缩测试。
压缩前:
在这里插入图片描述
压缩后:
在这里插入图片描述

附上完整demo链接:https://download.csdn.net/download/Struggling_Jeff/12387930

没积分没关系,留邮箱在下看到就发

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Zip压缩解压缩之C++实现。 的相关文章

随机推荐

  • 史上最全的正则表达式-匹配中英文、字母和数字

    1 匹配中文 u4e00 u9fa5 2 英文字母 a zA Z 3 数字 0 9 4 匹配中文 英文字母和数字及下划线 u4e00 u9fa5 a zA Z0 9 同时判断输入长度 u4e00 u9fa5 a zA Z0 9 4 10 5
  • vue3中将数据导出为excel表格

    目标 将vue3接口中得到的数据转换为数组 然后利用Export2Excel导出为excel表 1 开始之前要准备 1 Export2Excel js文件 在后面标题4附上 我是放在until目录下 2 npm i xlsx 安装失败后面加
  • 6.4-为何要深度学习

    文章目录 一 模型对比 二 模块化 Modularization 三 语音辨识 3 1 类比 Analogy 3 2 端到端学习 End to end Learning 四 复杂任务 五 更多的原因 一 模型对比 在参数量相同的条件下 究竟
  • dede仿站时----实现简单图片滚动(轮流图)效果

    第一次发文章 说的不好 请见谅 刚处理了标题这个问题 也百度半天没好办法 自己混乱的整理出来 所以发出来 说说自己的解决办法 直接代码 图 代码 dede arclist typeid 20 orderby pubdate type ima
  • 实战 逆向最新黄鸟抓包软件

    前言 观众器者为良匠 观众病者为良医 这篇文章分析了知名抓包软件HttpCanary高级功能的使用限制 使用了许多实用的工具 过程写的尽可能的详细 希望对大家有所帮助 笔者实践环境 pixel 6 Android 12 frida 15 1
  • 通过CUDA deviceQuery分析NVIDIA显卡性能

    参考 http blog sina com cn s blog 471e6c930102wlp5 html 序号 名称 值 解释 1 Detected 1 CUDA Capable device s 1 检测到1个可用的NVIDIA显卡设备
  • JetBrains全家桶激活地址

    全家桶地址 https www jetbrains com products html fromMenu JetBrains 授权服务器 License Server URL http idea imsxm com 使用方法 激活时选择Li
  • Oracle中RMAN基本命令教程

    一 target 连接数据库 1 本地 oracle oracle rman target 2 远程 oracle oracle rman target sys oracle orcl 二 show 查看配置 RMAN gt show al
  • JSP之cookie的使用说明

    1 cookie介绍 1 来自于Servlet规范中提供一个工具类 2 如果两个Servlet为同一个用户 用一个浏览器提供服务 此时借助于用户的cookie实现数据共享 3 cookie在现实生活中相当于用户的会员卡 当没有手动清除浏览器
  • Linux 进程间通讯

    文章目录 一 进程间通讯概念 进程通讯介绍 进程间通讯的分类 二 进程间通讯之管道 1 无名管道 无名管道概述 无名管道 API 无名管道的实例 无名管道的读写特点 设置为非阻塞的方法 2 有名管道 有名管道的概述 有名管道的使用 有名管道
  • RISC-V --rocket-chip generator介绍及其仿真使用

    最近工作使用 rocket chip generator 仿真非极大值抑制算法 C语言编写 分析其时序模型和riscv汇编指令 这里将rocket chip generator的使用方法总结一下 说明 使用的rocket chip gene
  • MOSFET知识小结

    MOSFET知识小结 MOSFET的基础知识 参见百度百科 场效应管 MOSFET的驱动 专用IC驱动 优点 电路集成度高 驱动能力强 使用简单 缺点 成本高 适用范围 非典型应用 如NMOS的高边驱动 驱动电流要求高的情况 注意事项 使用
  • 恒林家居引入纷享销客CRM系统,领跑家居行业营销数字化进程

    近日 恒林家居股份有限公司 股票代码 603661以下简称为 恒林家居 携手纷享销客在湖州召开了CRM项目启动会 双方领导及核心项目人员齐聚一堂 展开了深度交流并达成了重要共识 作为家居行业的领军企业 恒林家居自22年扩容 大家居 战略赛道
  • apache2.4配置服务器,文件都是从配好的服务器上直接拿下来的,极具参考性

    hello 大家好 我是咖啡汪 今天刚好给服务器配置了 SSL 证书 所以写这篇文章来分享下心得 以下文件包括了80 端口监听代理映射 和 443 端口监听代理映射 1 下载下来的ssl 证书截图如下 2 修改 httpd conf 内容如
  • java入门一:java语法基础

    1 注释 标识符 单行注释 多行注释 文字 文档注释 文字 注释不会被编译 写给程序员看 平时写代码一定写注释 方便别人看的懂你的代码 或者写久了自己忘了干嘛的 关键字 abstract assert boolean int class 不
  • 毕业差不多一年,跳槽华为od岗,已入职

    先说一下2022年上半年od岗的面试流程 简历筛选 全日制本科以上 机试 性格面试 技术一面 技术二面 hr面 主管面 博主当时面试到入职用了两个多月 都是线上面试 可以约晚上或者周末 机试 三道算法题 大概就是力扣简单 中等 困难的三种类
  • python中while循环打印99乘法表

    花式打印9 9乘法表 第一个计数器 i 1 while i lt 10 第二个计数器 j 1 while j lt i print d d d t j i i j end j 1 换行 print i 1 输出换行 print i 1 wh
  • 行业代码小程序开发制作方案

    随着移动互联网的快速发展 小程序成为用户获取服务的新途径 尤其在行业领域 如餐饮 零售 教育等 小程序的应用越来越广泛 方案旨在开发一款行业代码小程序 为行业用户提供便捷 高效的服务体验 一 产品定位 产品定位为行业代码小程序 旨在为行业用
  • 数据库基本概念review

    1 基本概念 1 1 数据库阶段 人工管理阶段 文件系统阶段 使用文件系统来进行管理 缺陷 数据荣誉 数据不一致 数据库阶段 三大事件 层次模型的出现 网状模型的出现 关系模型的出现 Codd 1 2 DB DBMS DBS定义 数据库 D
  • Zip压缩解压缩之C++实现。

    压缩 可压缩单一文件 也可压缩文件夹里的多个文件 包括文件夹里面的子文件夹 压缩的目标文件格式无限制 demo文件使用的是 text h cpp png bmp wav mp4等 解压缩 非覆盖解压缩 1 codeproject下载地址 h