当前位置:  编程技术>c/c++/嵌入式

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

    来源: 互联网  发布时间:2014-10-22

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



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

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


    
 
 

您可能感兴趣的文章:

  • JS的ZIP压缩和解压缩工具 Zip.js
  • 压缩/解压缩软件 7-Zip
  • 压缩/解压缩工具 p7zip
  • Linux下能压缩.zip 或 .rar 的压缩文件吗?
  • 请教有什么zip压缩库可以压缩文件夹?
  • zip在压缩文件的时候,可以把文件的权限也压缩进去吗?
  • 各位哥哥姐姐:如何zip压缩算法来压缩SKB里面的数据部分
  • 怎样解压缩.zip的压缩文件!!
  • 急,请问数据流是经过zip压缩的,Linux下如何编程,解开压缩的数据流?
  • .zip文件怎样在Unix下解压缩?.tar.tar文件怎样在Unix下解压缩
  • ZIP压缩工具包 TrueZIP
  • 如何在unix中将目录压缩成.zip的格式?(在线等)
  • 在windows下压缩成的.zip文件,在linux下解压后,不认识里边的中文目录和中文文件名,怎么办?(必须用.zip文件)
  • 50分在线等待,linux下如何解压缩zip文件?
  • 在solaris上面,.zip的压缩文件怎么打开?
  • zip如何分卷压缩
  • 求助关于zip命令,如何把文件压缩成指定大小的多个文件(Ubuntu7.04)
  • 压缩 FUSE 文件系统 fuse-zip
  • 解决Codeigniter不能上传rar和zip压缩包问题
  • 【请教】Linux下解zip压缩的问题
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • CI框架中zip类应用示例
  • php的zip解压缩类pclzip使用示例
  • 通过java api实现解压缩zip示例
  • apache ant进行zip解压缩操作示例分享
  • java实现服务器文件打包zip并下载的示例(边打包边下载)
  • java解压zip文件示例
  • java命名空间java.util.zip类zipfile的类成员方法: getinputstream定义及介绍
  • Java 的 zip 开发包 ZIP4J
  • java命名空间java.util.zip类zipfile的类成员方法: size定义及介绍
  • Linux下怎么用socket接收zip文件流?怎么把zip文件读成流?
  • java命名空间java.util.zip类zipfile的类成员方法: entries定义及介绍
  • 写入zip的麻烦--用zip包的看过来
  • java命名空间java.util.zip类zipfile的类成员方法: getname定义及介绍
  • php调用nginx的mod_zip模块打包ZIP文件
  • java命名空间java.util.zip类zipentry的类成员方法: zipentry定义及介绍
  • linux下如何解压zip文件
  • java命名空间java.util.zip类zipfile的类成员方法: close定义及介绍
  • CI框架中zip类简单实例
  • java命名空间java.util.zip类zipinputstream的类成员方法: closeentry定义及介绍
  • 7-Zip Theme Manager
  • java命名空间java.util.zip类zipoutputstream的类成员方法: closeentry定义及介绍
  • linux下zip出问题
  • java命名空间java.util.zip类zipoutputstream的类成员方法: putnextentry定义及介绍
  • linux 下安装zip问题,在线等
  • java命名空间java.util.zip类zipoutputstream的类成员方法: finish定义及介绍
  • linux下面怎么打开.rar和zip文件
  • java命名空间java.util.zip类zipinputstream的类成员方法: endcom定义及介绍
  • 如何zip一个文件夹下所有文件


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3