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;
    }
}

(0)

相关推荐

  • c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址 // GetHostIP.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <winsock2.h> #include <ws2tcpip.h> #include <stdio.h> #include <windows.h> #pragma comment(lib, "ws2_32.lib") int main(int argc,

  • C++实现获取IP、子网掩码、网关、DNS等本机网络参数的方法

    本文以一个完整实例形式介绍了C++实现获取IP.子网掩码.网关.DNS等本机网络参数的方法,供大家参考,具体的完整实例如下: #pragma comment(lib,"Ws2_32.lib") #include <Iphlpapi.h> #pragma comment(lib, "Iphlpapi.lib") using namespace std; typedef struct tagNetworkCfg { char szIP[18]; char s

  • C++取得本机IP的方法

    本文实例讲述了C++取得本机IP的方法,分享给大家供大家参考.具体方法如下: 核心代码如下: 复制代码 代码如下: //取得本机IP,在状态栏中显示  char szHostName[MAX_PATH] = {0};  ::gethostname(szHostName, MAX_PATH);  hostent *pHost = gethostbyname(szHostName);  if (pHost != NULL)  {      CString strIP;      in_addr* a

  • C++获取本机MAC,IP,MASK地址的方法

    本文实例讲述了C++获取本机MAC,IP,MASK地址的方法,分享给大家供大家参考.具体方法如下: 复制代码 代码如下: #include "InitSock.h"  #include <stdio.h>    #include <iphlpapi.h>  #pragma comment(lib, "IPHLPAPI.lib")    u_char g_ucLocalMac[6];  DWORD g_dwGatewayIP;  DWORD g

  • C++获取zip文件列表方法

    // ZipFile.h // #ifndef ZIPFILE_H #define ZIPFILE_H #include <string> #include <vector> #define ZIP_OK 0 #define ZIP_ERR_OPEN 1 #define ZIP_ERR_WRONG_FILE 2 #define ZIP_ERR_WRONG_HEADER 3 #define BYTE unsigned char #define ui32 unsigned int #d

  • C++Zip压缩解压缩示例(支持递归压缩)

    第三方函数.头文件.测试工程下载地址:http://pan.baidu.com/s/1gSfKo 复制代码 代码如下: // 文件名: ZipFunction.h#pragma once#include "zip.h"#include "unzip.h" namespace ZipUtils{    // ---------------------------------------------------------------------------------

  • ASP.NET页面进行GZIP压缩优化的几款压缩模块的使用简介及应用测试!(附源码)第1/2页

    在介绍之前,先简单说一说ASP.NET服务端GZIP压缩模块的作用及工作原理,很多人编写网页的时候页面因为使用了大量的JS特效又或者放置很多大型动态广告导致了页面或脚本体积庞大,通常都会使用一些压缩工具本地对页面或脚本进行一定的压缩后再上传到服务器,但这样的压缩工具一般压缩率有限,优化自然也不明显,本文章介绍的压缩模块的作用就是对asp.net的页面或脚本等资源进行高强度GZIP压缩(一般能压缩到只有1/5的体积),而且压缩的过程是发生在客户端请求aspx页面的时候由服务端进行压缩处理后再传送给

  • 使用java API实现zip递归压缩和解压文件夹

    一.概述 在本篇文章中,给大家介绍一下如何将文件进行zip压缩以及如何对zip包解压.所有这些都是使用Java提供的核心库java.util.zip来实现的. 二.压缩文件 首先我们来学习一个简单的例子-压缩单个文件.将一个名为test1.txt的文件压缩到一个名为Compressed.zip的zip文件中. public class ZipFile { public static void main(String[] args) throws IOException { //输出压缩包 Fil

  • Java 压缩图片并打包成ZIP文件的示例

    JAVA 获取网络图片或本地图片压缩后打成ZIP,但是获取网络流存在问题:每次获取图片流的大小不一样(图片不完整),以致无法构建图片进行压缩? /*  释以下代码:即可获取完整图片流网络不稳定情况且网络流是顺序读取,所以获得前部份流,不需要关闭连接,只需要将用完的流关闭即可  */   finally{       if(httpCon != null)       httpCon.disconnect();   }   package com.sunshine.monitor.comm.uti

  • Java实现把文件压缩成zip文件的示例代码

    实现代码 ackage org.fh.util; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; /** * 说明:java压缩成zip * 作者:FH Admin * from:fhadmin.cn */ public class Fi

  • 利用Java实现zip压缩/解压缩

    由于网络带宽有限,所以数据文件的压缩有利于数据在Internet上的快速传输,同时也节 省服务器的外存空间. Java 1.1实现了I/O数据流与网络数据流的单一接口,因此数据的压缩.网络传输和解 压缩的实现比较容易,下面介绍利用ZipEntry.ZipInputStream和ZipOutputStream三个Java 类实现zip数据压缩方式的编程方法. zip压缩文件结构:一个zip文件由多个entry组成,每个entry有一个唯一的名称,entry的 数据项存储压缩数据. 与zip文件有关

  • python 无损批量压缩图片(支持保留图片信息)的示例

    由于云盘空间有限,照片尺寸也是很大,所以写个Python程序压缩一下照片,腾出一些云盘空间 1.批量压缩照片 新建 photo_compress.py 代码如下 # -*- coding: utf-8 -*- """脚本功能说明:使用 tinypng api,一键批量压缩指定文件(夹)所有文件""" import os import sys from concurrent.futures import ThreadPoolExecutor, Pr

  • node.js实现简单的压缩/解压缩功能示例

    本文实例讲述了node.js实现简单的压缩/解压缩功能.分享给大家供大家参考,具体如下: 压缩的例子 非常简单的几行代码,就完成了本地文件的gzip压缩. var fs = require('fs'); var zlib = require('zlib'); var gzip = zlib.createGzip(); var inFile = fs.createReadStream('./extra/fileForCompress.txt'); var out = fs.createWriteS

  • python 实现压缩和解压缩的示例

    一.说明 压缩和解压缩是日常常用的操作,不管是windows上图形界面的操作,还是linux上用命令来进行压缩解压缩,总的而言都还是比较方便的. 但用代码来实现就没做过,近期也得实现代码压缩与解压缩操作,所以就抽时间来研究一下. 二.zip文件压缩和解压缩实现 import os import zipfile # 函数功能是zip_file_list所有文件,和zip_dir_list所有目录下的所有文件,被压缩到一个zip_file_name的压缩文件中 def my_zip_function

  • Java压缩解压缩工具类

    本文实例为大家分享了Java压缩解压缩工具类的具体代码,供大家参考,具体内容如下 package com.wdy.tools.utils.pressuitl; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import

随机推荐