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

 更新时间:2013年11月24日 11:44:53   作者:  
C++Zip压缩解压缩示例,用第三方函数封装而成,支持 UNCODE, ANSCII、支持压缩文件夹、支持递归压缩



第三方函数、头文件、测试工程下载地址: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;
    }
}

相关文章

  • 使用OpenGL实现3D立体显示的程序代码

    使用OpenGL实现3D立体显示的程序代码

    本篇文章是对使用OpenGL实现3D立体显示的方法进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 一些C语言中字符串的算法问题解决实例小结

    一些C语言中字符串的算法问题解决实例小结

    这篇文章主要介绍了一些C语言中字符串的算法问题解决实例小结,包括将字符串转化为int类型的数及旋转字符串等操作,需要的朋友可以参考下
    2016-03-03
  • 华为面试题答案找出最大长度子字符串

    华为面试题答案找出最大长度子字符串

    找出最大长度子字符串,打印并且返回长度。 例如 str = "abc123abcd234abcdefgha324adsdawqdasdaseqqwe345abchded",看下面的代码实现吧
    2013-12-12
  • C++中的四个默认成员函数与运算符重载详解

    C++中的四个默认成员函数与运算符重载详解

    这篇文章主要给大家介绍了关于C++中四个默认成员函数与运算符重载的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来跟着小编一起学习学习吧。
    2017-08-08
  • 详解C++实现链表的排序算法

    详解C++实现链表的排序算法

    链表排序思想和数组排序类似,区别就是数组遍历容易,数据交换也容易;链表(单项链表)只能一个方向遍历,不能逆序遍历,且不能随机访问,所以排序比较麻烦。本文将详细介绍链表排序的方式,并且用C++来实现
    2021-06-06
  • C语言设计前中后队列实例代码

    C语言设计前中后队列实例代码

    队列最主要的作用就是用来管理数据流的,防止数据因为传输频率过快得不到及时处理而丢失,下面这篇文章主要给大家介绍了关于C语言设计前中后队列的相关资料,需要的朋友可以参考下
    2021-12-12
  • 八皇后问题实现代码分享

    八皇后问题实现代码分享

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例,这篇文章主要介绍了八皇后问题实现代码,需要的朋友可以参考下
    2014-02-02
  • C++编程异常处理中try和throw以及catch语句的用法

    C++编程异常处理中try和throw以及catch语句的用法

    这篇文章主要介绍了C++编程异常处理中try和throw以及catch语句的用法,包括对Catch块的计算方式的介绍,需要的朋友可以参考下
    2016-01-01
  • C语言数组和指针的问题一道非常值得深思的笔试题

    C语言数组和指针的问题一道非常值得深思的笔试题

    今天小编就为大家分享一篇关于C语言数组和指针的问题一道非常值得深思的笔试题,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-12-12
  • C语言实现三子棋程序

    C语言实现三子棋程序

    这篇文章主要为大家详细介绍了C语言实现三子棋程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03

最新评论