C++Zip压缩解压缩示例(支持递归压缩)
第三方函数、头文件、测试工程下载地址:http://pan.baidu.com/s/1gSfKo
// 文件名: ZipFunction.h
#pragma once
#include "zip.h"
#include "unzip.h"
namespace ZipUtils
{
// ------------------------------------------------------------------------------------------------------------------------
// Summary:
// 解压zip文件到指定路径, 并返回解压文件路径和文件名。
// Parameters:
// lpszZipFullName - 待解压 zip压缩包所在文件夹路径和zip压缩名称; 如"D://00//1.zip"。
// szFilePathArr - 保存的解压后文件的文件名;如"1.jpg"。
// lpszUnZipPath - 解压出来的文件 所存放位置的完整路径; 如 “D://01”
// 此参数省略时,默认解压到exe程序所在文件夹下。
// Returns:
// 解压成功返回ZR_OK,解压失败返回错误码。
// ------------------------------------------------------------------------------------------------------------------------
ZRESULT ExtractZipToDir(LPCTSTR lpszZipFullName, CStringArray& szFilePathArr, LPCTSTR lpszUnZipPath = NULL);
// ------------------------------------------------------------------------------------------------------------------------
// Summary:
// 压缩指定路径下的文件,并保存压缩包到指定路径。
// Parameters:
// lpszSrcPath - 待压缩文件所在的路径; 如"D://00"。
// lpszDestPath - 压缩完成后,存放压缩包的路径。
// 此参数省略时,默认存放路径为exe程序所在文件的路径。
// lpszZipName - 压缩完成后,压缩的名称;如“MySkin.zip”。
// Returns:
// 压缩成功返回ZR_OK,压缩失败返回错误码。
// ------------------------------------------------------------------------------------------------------------------------
ZRESULT CompressDirToZip(LPCTSTR lpszSrcPath, LPCTSTR lpszZipName, LPCTSTR lpszDestPath = NULL);
}
#include "stdafx.h"
#include "ZipFunction.h"
#include <io.h>
namespace ZipUtils
{
// 全局变量
int g_nCount = 0;
ZRESULT ExtractZipToDir(LPCTSTR lpszZipFullName, CStringArray& szFilePathArr, LPCTSTR lpszUnZipPath)
{
TCHAR buffer[MAX_PATH] = {0};
CString strUnZipPath = lpszUnZipPath;
DWORD zResult = ZR_OK;
if (!strUnZipPath.IsEmpty())
{
// 如果文件路径不存在先创建,存在不做任何修改
SHCreateDirectoryEx(NULL, lpszUnZipPath, NULL);
}
else
{
GetCurrentDirectory(MAX_PATH, (LPTSTR)&buffer);
strUnZipPath = buffer;
SHCreateDirectoryEx(NULL, strUnZipPath, NULL);
}
HZIP hz = OpenZip(lpszZipFullName, 0);
ZIPENTRY ze;
GetZipItem(hz, -1, &ze);
int numitems = ze.index;
for (int zi = 0; zi < numitems; zi++)
{
ZIPENTRY ze;
GetZipItem(hz,zi,&ze);
zResult = UnzipItem(hz, zi, (CString)strUnZipPath+_T("\\")+ze.name);
szFilePathArr.Add(ze.name);
if (zResult != ZR_OK)
{
#ifndef _UNICODE
// 判断文件是否存在
if (_access(szFilePathArr[zi], 0))
{
// 文件不存在的时候
return zResult;
}
#else
if (_access((char *)(LPTSTR)(LPCTSTR)szFilePathArr[zi], 0))
{
// 文件不存在的时候
return zResult;
}
#endif
}
}
CloseZip(hz);
return zResult;
}
ZRESULT DirToZip(LPCTSTR lpszSrcPath, LPCTSTR lpszZipName, HZIP& hz, LPCTSTR lpszDestPath)
{
static CString strFileName;
g_nCount++;
DWORD zResult = ZR_OK;
TCHAR buffer[MAX_PATH] = {0};
CString strDestPath = lpszDestPath;
if (g_nCount == 1)
{
// 这里边的只执行一次
if (!strDestPath.IsEmpty())
{
// 如果解压路径文件夹不存在 先创建,存在 不做任何修改
SHCreateDirectoryEx(NULL, lpszDestPath, NULL);
}
else
{
GetCurrentDirectory(MAX_PATH, (LPTSTR)&buffer);
strDestPath = buffer;
SHCreateDirectoryEx(NULL, strDestPath, NULL);
}
hz = CreateZip((CString)strDestPath+_T("\\")+(CString)lpszZipName, 0);
}
HANDLE file;
WIN32_FIND_DATA fileData;
file = FindFirstFile((CString)lpszSrcPath+_T("\\*.*"), &fileData);
FindNextFile(file, &fileData);
while (FindNextFile(file, &fileData))
{
// 如果是一个文件目录
if(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (strFileName.IsEmpty())
{
ZipAddFolder(hz, fileData.cFileName);
}
else
{
ZipAddFolder(hz, strFileName+_T("\\")+fileData.cFileName);
}
strFileName = fileData.cFileName;
// 存在子文件夹 递归调用
DirToZip((CString)lpszSrcPath+_T("\\")+ fileData.cFileName, lpszZipName, hz, lpszDestPath);
strFileName.Empty();
}
else
{
CString strTempPath;
strTempPath.Format(_T("%s\\%s"), (CString)lpszSrcPath, fileData.cFileName);
if (strFileName.IsEmpty())
{
ZipAdd(hz, fileData.cFileName, strTempPath);
}
else
{
ZipAdd(hz, strFileName+_T("\\")+fileData.cFileName, strTempPath);
}
if (zResult != ZR_OK)
{
return zResult;
}
}
}
return zResult;
}
ZRESULT CompressDirToZip(LPCTSTR lpszSrcPath, LPCTSTR lpszZipName, LPCTSTR lpszDestPath)
{
HZIP hz;
DWORD zResult = ZR_OK;
zResult = DirToZip(lpszSrcPath, lpszZipName,hz, lpszDestPath);
if(zResult == ZR_OK)
{
CloseZip(hz);
}
g_nCount = 0;
return zResult;
}
}
上一篇:c语言中使用BF-KMP算法实例
栏 目:C语言
下一篇:c++读写文件流实例程序讲解
本文地址:https://www.xiuzhanwang.com/a1/Cyuyan/3887.html
您可能感兴趣的文章
- 01-10c语言求1+2+...+n的解决方法
- 01-10求子数组最大和的解决方法详解
- 01-10深入理解约瑟夫环的数学优化方法
- 01-10深入二叉树两个结点的最低共同父结点的详解
- 01-10数据结构课程设计- 解析最少换车次数的问题详解
- 01-10c语言 跳台阶问题的解决方法
- 01-10数据结构课程设计-用栈实现表达式求值的方法详解
- 01-10HDOJ 1443 约瑟夫环的最新应用分析详解
- 01-10深入理解C++中常见的关键字含义
- 01-10用贪心法求解背包问题的解决方法
阅读排行
本栏相关
- 04-02c语言函数调用后清空内存 c语言调用
- 04-02func函数+在C语言 func函数在c语言中
- 04-02c语言的正则匹配函数 c语言正则表达
- 04-02c语言用函数写分段 用c语言表示分段
- 04-02c语言中对数函数的表达式 c语言中对
- 04-02c语言编写函数冒泡排序 c语言冒泡排
- 04-02c语言没有round函数 round c语言
- 04-02c语言分段函数怎么求 用c语言求分段
- 04-02C语言中怎么打出三角函数 c语言中怎
- 04-02c语言调用函数求fibo C语言调用函数求
随机阅读
- 08-05织梦dedecms什么时候用栏目交叉功能?
- 08-05dedecms(织梦)副栏目数量限制代码修改
- 01-10delphi制作wav文件的方法
- 01-11ajax实现页面的局部加载
- 01-10C#中split用法实例总结
- 01-10SublimeText编译C开发环境设置
- 01-10使用C语言求解扑克牌的顺子及n个骰子
- 01-11Mac OSX 打开原生自带读写NTFS功能(图文
- 04-02jquery与jsp,用jquery
- 08-05DEDE织梦data目录下的sessions文件夹有什