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

使用zlib-1.2.11版本的开源库,实现我需要的对文件或者文件夹的压缩,查阅了一些博客大牛的资料,后面根据自己的需要修改。下面给出我的代码:

#include "stdafx.h"
#include <string>
#include <iostream>
#include <vector>
#include <Shlwapi.h>
#include "zip.h"
#include "unzip.h"
#include "zlib.h"
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <sstream>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", _SH_DENYNO);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;elserelativepath = 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开源库相关推荐

  1. C++ 使用zlib开源库的minizip解压缩文件及文件夹

    首先 GitHub 上下载 zlib 的发行版本进行编译: 如果出现 zlib报"LNK2001:无法解析的外部符号"错误 的情况,是因为编译zlib(dll)的工程默认有预处理器 ...

  2. 【转】DCMTK开源库的学习笔记3:dcmtk文件中数据元的修改

    转自:https://blog.csdn.net/zssureqh/article/details/8804736 dcm文件是医学领域DICOM3.0标准所对应的主要的文件格式.前两篇学习笔记中,学 ...

  3. asp在线压缩和解压缩文件(文件夹)

    asp在线压缩和解压缩文件(文件夹) <% '\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ '\\ '\\ 1. c:\ ...

  4. python生成多级文件夹_Python zipfile压缩文件和文件夹(支持多级目录)

    支持压缩单个文件和多级文件夹 使用方法 zip_compress(to_zip,save_zip_name):#to_zip表示源文件或者源目录,save_zip_name表示目的zip文件(可带目录 ...

  5. 利用WinRAR命令行压缩文件或文件夹

    利用WinRAR命令行压缩文件或文件夹 2007-11-14 15:07 压缩文件夹winrar.exe a -ag -k -r -s -ibck c:/bak.rar c:/dat/ 压缩多个文件 ...

  6. 利用WinRAR命令行压缩文件或文件夹2007-11-14 15:07压缩文件夹

    利用WinRAR命令行压缩文件或文件夹 2007-11-14 15:07 压缩文件夹winrar.exe a -ag -k -r -s -ibck c:/bak.rar c:/dat/ 压缩多个文件 ...

  7. canvas 将图形设置为button_将Excel设置为存放文件的文件夹:自动提醒直观摘要免压缩发微信...

    [友情提示]更多插入对象应用,敬请关注头条号@Excel财务VBA,了解后续文章介绍. 导读:一.文件夹的作用,二.win文件夹的局限,三.Excel准文件夹的应用需求,四.Excel准文件夹的设置方 ...

  8. Java实现将文件或者文件夹压缩成zip

    Java实现将文件或者文件夹压缩成zip 最近碰到个需要下载zip压缩包的需求,于是我在网上找了下别人写好的zip工具类.但找了好多篇博客,总是发现有bug.因此就自己来写了个工具类. 这个工具类的功 ...

  9. java 压缩文件夹_java 实现压缩文件(单文件 或 文件夹)

    接着上篇了解一下java压缩实现过程,下面的是支持 单文件 或 文件夹 压缩的实现,使用递归. 效果: 代码: package com.gx.compress; import java.io.Buff ...

最新文章

  1. DP 之 poj 2229
  2. Flume性能测试报告
  3. 我的世界java版记分板_我的世界计分板指令 如何使用计分板教程
  4. mysql gis 时间_MySQL interval()函数
  5. ySQL性能优化的21个最佳实践 和 mysql使用索引
  6. 五分钟快速过完Verilog HDL基本概念(3)语法讲解
  7. Java 中如何实现保留两位小数 — DecimalFormat
  8. html里面怎么引入swiper,JavaScript库——使用swiper.js创建嵌套的swiper
  9. 从零基础入门Tensorflow2.0 ----六、28 深度可分离卷积神经网络
  10. 暴风影音- C++研发工程师(windows方向-在线视频)
  11. 第一次破解unity3d安卓游戏笔记+IL指令集合
  12. php网页代码字体大小,html字体大小怎么设置
  13. 在计算机病毒组成结构中,计算机病毒的结构中有哪三种机制组成?
  14. 【软件工具】之下载微软官方正版 windows 系统
  15. Keras LSTM实现多维输入输出时序预测实践详解
  16. 一寸照片多大?你知道一寸照片的尺寸吗?
  17. python外包挺多,但具体什么价位呢,今天我们来采集一下外包网~
  18. Frame skipped from debugging during step-in. Note: may have been skipped because of “justMyCode“
  19. 证明:不同特征值对应的特征向量线性无关
  20. 网络通信之如何广播发送

热门文章

  1. 常用温度传感器的采集和换算方法
  2. try catch finally,try里有return,finally还执行么?
  3. DSP数据手册和技术参考手册的使用
  4. 20分钟快速入门Nginx
  5. Delphi : 分割字符串string,取出截取中间字符串
  6. PMP十万个为什么(一)
  7. Web性能优化方法总结
  8. BiLSTM之二:工程应用须知
  9. Tomcat最全面的解析和作用介绍
  10. 详解JAVA类加载机制