您好,欢迎来到99网。
搜索
您的当前位置:首页C++压缩文件及文件夹方法使用zlib开源库

C++压缩文件及文件夹方法使用zlib开源库

来源:99网
C++压缩⽂件及⽂件夹⽅法使⽤zlib开源库

使⽤zlib-1.2.11版本的开源库,实现我需要的对⽂件或者⽂件夹的压缩,查阅了⼀些博客⼤⽜的资料,后⾯根据⾃⼰的需要修改。

下⾯给出我的代码:

#include \"stdafx.h\"#include #include #include #include #include \"zip.h\"#include \"unzip.h\"#include \"zlib.h\"#include #include #include #include using namespace std;

//部分头⽂件不需要(⾃⾏去掉)#pragma comment(lib, \"Shlwapi.lib\")

bool nyAddfiletoZip(zipFile zfile, const std::string& fileNameinZip, const std::string& srcfile);

bool nyCollectfileInDirtoZip(zipFile zfile, const std::string& filepath, const std::string& parentdirName);

bool nyCreateZipfromDir(const std::string& dirpathName, const std::string& zipfileName, const std::string& parentdirName);int _tmain(int argc, _TCHAR* argv[]){

std::string dirpath = \"D:\\\\RecycleBin\\\\wei\"; //源⽂件/⽂件夹

std::string zipfileName = \"D:\\\\RecycleBin\\\\lango.rar\"; //⽬的压缩包 nyCreateZipfromDir(dirpath, zipfileName, \"wei\"); system(\"pause\"); return 0;}/*

* 函数功能 :解压zip⽂件

* 备 注 :参数strFilePath表⽰zip压缩⽂件的路径* 参数strTempPath表⽰要解压到的⽂件⽬录*/

bool nyAddfiletoZip(zipFile zfile, const std::string& fileNameinZip, const std::string& srcfile){

if (NULL == zfile || fileNameinZip.empty()/* || srcfile.empty()为空代表空⽬录*/) {

return 0; }

int nErr = 0;

zip_fileinfo zinfo = {0}; tm_zip tmz = { 0 }; zinfo.tmz_date = tmz; zinfo.dosDate = 0; zinfo.internal_fa = 0; zinfo.external_fa = 0;

char sznewfileName[MAX_PATH] = { 0 };

memset(sznewfileName, 0x00, sizeof(sznewfileName)); strcat_s(sznewfileName, fileNameinZip.c_str()); if (srcfile.empty()) {

strcat_s(sznewfileName, \"\\\\\"); }

nErr = zipOpenNewFileInZip(zfile, sznewfileName, &zinfo, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION); if (nErr != ZIP_OK) {

return false; }

if (!srcfile.empty()) {

//打开源⽂件

FILE* srcfp = _fsopen(srcfile.c_str(), \"rb\ if (NULL == srcfp) {

std::cout << \"Open source file failed.\" << std::endl; return false; }

//读⼊源⽂件写⼊zip⽂件 int numBytes = 0;

char* pBuf = new char[1024 * 100]; if (NULL == pBuf) {

std::cout << \"new buffer failed.\" << std::endl; return 0; }

while (!feof(srcfp)) {

memset(pBuf, 0x00, sizeof(pBuf));

numBytes = fread(pBuf, 1, sizeof(pBuf), srcfp); nErr = zipWriteInFileInZip(zfile, pBuf, numBytes); if (ferror(srcfp)) {

break; } }

delete[] pBuf; fclose(srcfp); }

zipCloseFileInZip(zfile); return true;}

bool nyCollectfileInDirtoZip(zipFile zfile, const std::string& filepath, const std::string& parentdirName){

if (NULL == zfile || filepath.empty()) {

return false; }

bool bFile = false;

std::string relativepath = \"\";

WIN32_FIND_DATAA findFileData; char szpath[MAX_PATH] = { 0 };

if (::PathIsDirectoryA(filepath.c_str())) {

strcpy_s(szpath, sizeof(szpath) / sizeof(szpath[0]), filepath.c_str()); int len = strlen(szpath) + strlen(\"\\\\*.*\") + 1; strcat_s(szpath, len, \"\\\\*.*\"); } else {

bFile = true;

strcpy_s(szpath, sizeof(szpath) / sizeof(szpath[0]), filepath.c_str()); }

HANDLE hFile = ::FindFirstFileA(szpath, &findFileData); if (NULL == hFile) {

return false; } do {

if (parentdirName.empty())

relativepath = findFileData.cFileName; else

relativepath = parentdirName + \"\\\\\" + findFileData.cFileName;//⽣成zip⽂件中的相对路径 if (findFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) {

if (strcmp(findFileData.cFileName, \".\") != 0 && strcmp(findFileData.cFileName, \"..\") != 0) {

nyAddfiletoZip(zfile, relativepath, \"\"); char szTemp[MAX_PATH] = { 0 }; strcpy_s(szTemp, filepath.c_str()); strcat_s(szTemp, \"\\\\\");

strcat_s(szTemp, findFileData.cFileName);

nyCollectfileInDirtoZip(zfile, szTemp, relativepath); }

continue; }

char szTemp[MAX_PATH] = { 0 }; if (bFile) {

//注意:处理单独⽂件的压缩

strcpy_s(szTemp, filepath.c_str()); } else {

//注意:处理⽬录⽂件的压缩

strcpy_s(szTemp, filepath.c_str()); strcat_s(szTemp, \"\\\\\");

strcat_s(szTemp, findFileData.cFileName); }

nyAddfiletoZip(zfile, relativepath, szTemp); } while (::FindNextFileA(hFile, &findFileData)); FindClose(hFile); return true;}

bool nyCreateZipfromDir(const std::string& dirpathName, const std::string& zipfileName, const std::string& parentdirName){

bool bRet = false;

/***********参数注释*********/

/*APPEND_STATUS_CREATE 创建追加

APPEND_STATUS_CREATEAFTER 创建后追加(覆盖⽅式) APPEND_STATUS_ADDINZIP 直接追加*/ /****************************/ zipFile zFile = NULL;

if (!::PathFileExistsA(zipfileName.c_str())) {

zFile = zipOpen(zipfileName.c_str(), APPEND_STATUS_CREATE); } else {

zFile = zipOpen(zipfileName.c_str(), APPEND_STATUS_ADDINZIP); }

if (NULL == zFile) {

std::cout << \"create zip file failed.\" << std::endl; return bRet; }

if (nyCollectfileInDirtoZip(zFile, dirpathName, parentdirName)) {

bRet = true; }

zipClose(zFile, NULL); return bRet;}

zlib库⾃⾏下载来编译,然后加⼊到⾃⼰的项⽬⾥⾯去,(需要重新编译哦,不顺利的话可能会遇到很多问题哦x_O)。在下刚出⾃茅庐,不⾜之处还望指教,相互学习。后⾯还有解压部分(阅读了⼀个⼤神的代码,后来发现了⼀个严肃的问题,我进⾏了改正。x_O)到时候再把demo上传吧!

以上这篇C++ 压缩⽂件及⽂件夹⽅法 使⽤zlib开源库就是⼩编分享给⼤家的全部内容了,希望能给⼤家⼀个参考,也希望⼤家多多⽀持。

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 99spj.com 版权所有 湘ICP备2022005869号-5

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务