C++Zip緊縮解緊縮示例(支撐遞歸緊縮)。本站提示廣大學習愛好者:(C++Zip緊縮解緊縮示例(支撐遞歸緊縮))文章只能為提供參考,不一定能成為您想要的結果。以下是C++Zip緊縮解緊縮示例(支撐遞歸緊縮)正文
第三方函數、頭文件、測試工程下載地址:http://pan.百度.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;
}
}