精华内容
下载资源
问答
  • 使用VC++用ZIP格式压缩解压缩文件夹

    千次阅读 2013-10-09 14:32:39
    项目中要用到一个压缩解压缩的模块, 看了很多文章和源代码,  都不是很称心, 现在把我自己实现的代码和大家分享....实现文件夹压缩解压缩即可.(不提供单文件压缩和内存压缩)  4.压缩格式ZIP.  5.具有一定的容错能力
      项目中要用到一个压缩解压缩的模块, 看了很多文章和源代码, 
    
    都不是很称心, 现在把我自己实现的代码和大家分享.

    要求:

     

           1.使用Unicode(支持中文).

           2.使用源代码.(不使用静态或者动态库)

           3.实现文件夹压缩解压缩即可.(不提供单文件压缩和内存压缩)

           4.压缩格式为ZIP.

           5.具有一定的容错能力.(判断用户输入的内容)

     

    代码如下:

    *********************ZipImplement.h*********************

    /
    // 文件名:
    // 创建者:
    // 创建日期: 2009-09-27 下午 04:51:46
    //
    // 说明:压缩解压缩地图文件夹
    /

    #pragma once

    #include "zip.h"
    #include "unzip.h"

    class CZipImplement
    {
    public:
        CZipImplement(void);
        ~CZipImplement(void);

    private:
        HZIP hz;          //Zip文件句柄
        ZRESULT zr;    //操作返回值
        ZIPENTRY ze;  //Zip文件入口

        CString m_FolderPath;     //folder路径
        CString  m_FolderName;  //folder将要被压缩的文件夹名

    private:
        //实现遍历文件夹
        void BrowseFile(CString &strFile);

        //获取相对路径
        void GetRelativePath(CString& pFullPath, CString& pSubString);

        //创建路径
        BOOL CreatedMultipleDirectory(wchar_t* direct);
        ///*
        //***********************************************************************
        //* 函数: TransCStringToTCHAR
        //* 描述:将CString 转换为 TCHAR*
        //***********************************************************************
        //*/
        //TCHAR* CString2TCHAR(CString &str)
        //{
        //    int iLen = str.GetLength();
        //    TCHAR* szRs = new TCHAR[iLen];
        //    lstrcpy(szRs, str.GetBuffer(iLen));
        //    str.ReleaseBuffer();
        //    return szRs;
        //}

    public:
        //压缩文件夹接口
        BOOL Zip_PackFiles(CString& pFilePath, CString& mZipFileFullPath);

        //解压缩文件夹接口
        BOOL Zip_UnPackFiles(CString &mZipFileFullPath, CString& mUnPackPath);

    public:
        //静态方法提供文件夹路径检查
        static BOOL FolderExist(CString& strPath);
    };

     

    *********************ZipImplement.cpp*********************

    /
    // 文件名:
    // 创建者:
    // 创建日期: 2009-09-27 下午 04:51:46
    //
    // 说明:压缩解压缩地图文件夹
    /

    #include "StdAfx.h"
    #include "zipimplement.h"
    #include
    #include
    #include

    CZipImplement::CZipImplement(void)
    {
    }

    CZipImplement::~CZipImplement(void)
    {
    }

    /
    // 函数说明: 实现压缩文件夹操作
    // 参数说明: [in]: pFilePath         要被压缩的文件夹
    //                         mZipFileFullPath  压缩后的文件名和路径
    // 返回值: 参数有误的情况下返回FALSE,压缩成功后返回TRUE
    // 函数作者:
    // 创建日期: 2009-09-27 下午 04:58:52
    /
    BOOL CZipImplement::Zip_PackFiles(CString& pFilePath, CString& mZipFileFullPath)
    {
        //参数错误
        if ((pFilePath == L"") || (mZipFileFullPath == L""))
        {
            //路径异常返回
            return FALSE ;
        }

        if(!CZipImplement::FolderExist(pFilePath))
        {
            //要被压缩的文件夹不存在
            return FALSE ;
        }

        CString tZipFilePath = mZipFileFullPath.Left(mZipFileFullPath.ReverseFind('//') + 1);
        if(!CZipImplement::FolderExist(tZipFilePath))
        {
            //ZIP文件存放的文件夹不存在创建它
            wchar_t* temp=tZipFilePath.GetBuffer(tZipFilePath.GetLength());
            if (FALSE == CreatedMultipleDirectory(temp))
            {
                //创建目录失败
                return FALSE;
            }
        }

        //获得文件夹的名字
        if(pFilePath.Right(1) == L"//")
        {
            this->m_FolderPath = pFilePath.Left(pFilePath.GetLength() - 1);
            m_FolderName = m_FolderPath.Right(m_FolderPath.GetLength() - m_FolderPath.ReverseFind('//') - 1);
        }
        else
        {
            this->m_FolderPath = pFilePath;
            m_FolderName = pFilePath.Right(pFilePath.GetLength() - pFilePath.ReverseFind('//') - 1);
        }

        /************************************************************************/

        //创建ZIP文件
        hz=CreateZip(mZipFileFullPath,0);
        if(hz == 0)
        {
            //创建Zip文件失败
            return FALSE;
        }

        //递归文件夹,将获取的问价加入ZIP文件
        BrowseFile(pFilePath);
        //关闭ZIP文件
        CloseZip(hz);

        /************************************************************************/

        CFileFind tFFind;
        if (!tFFind.FindFile(mZipFileFullPath))
        {
            //压缩失败(未发现压缩后的文件)
            return FALSE;
        }

        return TRUE;
    }

    /
    // 函数说明: 解压缩文件夹
    // 参数说明: [in]: mUnPackPath     解压后文件存放的路径
    //                         mZipFileFullPath  ZIP文件的路径
    // 返回值:
    // 函数作者:
    // 创建日期: 2009-09-27 上午 11:04:28
    /
    BOOL CZipImplement::Zip_UnPackFiles(CString &mZipFileFullPath, CString& mUnPackPath)
    {
        //参数错误
        if ((mUnPackPath == L"") || (mZipFileFullPath == L""))
        {
            //路径异常返回
            return FALSE ;
        }

        CFileFind tFFind;
        if (!tFFind.FindFile(mZipFileFullPath))
        {
            //压缩失败(未发现压缩文件)
            return FALSE;
        }

        //如果解压缩的路径不存在 试图创建它
        CString tZipFilePath = mUnPackPath;
        if(!CZipImplement::FolderExist(tZipFilePath))
        {
            //解压后存放的文件夹不存在 创建它
            wchar_t* temp=tZipFilePath.GetBuffer(tZipFilePath.GetLength());
            if (FALSE == CreatedMultipleDirectory(temp))
            {
                //创建目录失败
                return FALSE;
            }
        }
        /************************************************************************/
        //打开ZIP文件
        hz=OpenZip(mZipFileFullPath,0);
        if(hz == 0)
        {
            //打开Zip文件失败
            return FALSE;
        }

        zr=SetUnzipBaseDir(hz,mUnPackPath);
        if(zr != ZR_OK)
        {
            //打开Zip文件失败
            CloseZip(hz);
            return FALSE;      
        }

        zr=GetZipItem(hz,-1,&ze);
        if(zr != ZR_OK)
        {
            //获取Zip文件内容失败
            CloseZip(hz);
            return FALSE;      
        }

        int numitems=ze.index;
        for (int i=0; i     {
            zr=GetZipItem(hz,i,&ze);
            zr=UnzipItem(hz,i,ze.name);

            if(zr != ZR_OK)
            {
                //获取Zip文件内容失败
                CloseZip(hz);
                return FALSE;      
            }
        }

        CloseZip(hz);
        return TRUE;
    }

    /
    // 函数说明: 检查指定的文件夹是否存在
    // 参数说明: [in]:strPath 检查的文件夹 (此方法会主动向路径末尾添加*.*)
    // 返回值:BOOL类型,存在返回TRUE,否则为FALSE
    // 函数作者:
    // 创建日期: 2009-09-27 下午 02:16:36
    /
    BOOL CZipImplement::FolderExist(CString& strPath)
    {
        CString sCheckPath = strPath;

        if(sCheckPath.Right(1) != L"//")
            sCheckPath += L"//";

        sCheckPath += L"*.*";

        WIN32_FIND_DATA wfd;
        BOOL rValue = FALSE;

        HANDLE hFind = FindFirstFile(sCheckPath, &wfd);

        if ((hFind!=INVALID_HANDLE_VALUE) &&
            (wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) || (wfd.dwFileAttributes&FILE_ATTRIBUTE_ARCHIVE))
        {
            //如果存在并类型是文件夹
            rValue = TRUE;
        }

        FindClose(hFind);
        return rValue;
    }

    /
    // 函数说明: 遍历文件夹
    // 参数说明: [in]:strFile 遍历的文件夹(此方法会主动向路径末尾添加*.*)
    // 返回值:BOOL类型,存在返回TRUE,否则为FALSE
    // 函数作者:
    // 创建日期: 2009-09-27 下午 02:16:36
    /
    void CZipImplement::BrowseFile(CString &strFile)
    {
        CFileFind ff;
        CString szDir = strFile;

        if(szDir.Right(1) != L"//")
            szDir += L"//";

        szDir += L"*.*";

        BOOL res = ff.FindFile(szDir);
        while(res)
        {
            res = ff.FindNextFile();
            if(ff.IsDirectory() && !ff.IsDots())
            {
                //如果是一个子目录,用递归继续往深一层找
                CString strPath = ff.GetFilePath();

                CString subPath;
                GetRelativePath(strPath,subPath);
                //将文件添加到ZIP文件
                ZipAddFolder(hz,subPath);
                BrowseFile(strPath);
            }
            else if(!ff.IsDirectory() && !ff.IsDots())
            {
                //显示当前访问的文件(完整路径)
                CString strPath = ff.GetFilePath();
                CString subPath;

                GetRelativePath(strPath,subPath);
                //将文件添加到ZIP文件
                ZipAdd(hz,subPath,strPath);
            }
        }

        //关闭
        ff.Close();
    }

    /
    // 函数说明: 获取相对路径
    // 参数说明: [in]:pFullPath 当前文件的完整路径 [out] : 解析后的相对路径
    // 函数作者:
    // 创建日期: 2009-9-28 上午 11:17:21
    /
    void CZipImplement::GetRelativePath(CString& pFullPath,CString& pSubString)
    {
        pSubString = pFullPath.Right(pFullPath.GetLength() - this->m_FolderPath.GetLength() + this->m_FolderName.GetLength());
    }

    /
    // 函数说明: 创建多级目录
    // 参数说明: [in]: 路径字符串
    // 返回值: BOOL 成功True 失败False
    // 函数作者:
    // 创建日期: 2009-9-28 下午 04:53:20
    /
    BOOL CZipImplement::CreatedMultipleDirectory(wchar_t* direct)
    {
        std::wstring Directoryname = direct;

        if (Directoryname[Directoryname.length() - 1] !=  '//')
        {
            Directoryname.append(1, '//');
        }
        std::vector< std::wstring> vpath;
        std::wstring strtemp;
        BOOL  bSuccess = FALSE;
        for (int i = 0; i < Directoryname.length(); i++)
        {
            if ( Directoryname[i] != '//')
            {
                strtemp.append(1,Directoryname[i]);   
            }
            else
            {
                vpath.push_back(strtemp);
                strtemp.append(1, '//');
            }
        }
        std::vector:: const_iterator vIter;
        for (vIter = vpath.begin();vIter != vpath.end(); vIter++)
        {
            bSuccess = CreateDirectory(vIter->c_str(), NULL) ? TRUE :FALSE;
        }

        return bSuccess;
    }

     

    =====================以上为源代码=====================

    简单说明:

    1.使用VS2003编写.

    2.WinXp sp2下运行测试通过.

    3.为了简化算法,使用了很多MFC提供的函数, 如果要移植到标准C++请重新实现部分函数.

    4.压缩算法采用了ljw1004 这位高手的算法.

    5."zip.h" 和 "unzip.h"以及实现请至 http://www.codeproject.com/KB/files/zip_utils.aspx 下载, 下载的源文件中有示例程序可以参考.
        将下载后的 zip.h unzip.h zip.cpp unzip.cpp 添加到自己的项目中.

    后记:第一次使用VC++开发项目,遇到了很多问题,对于相关的问题和我自己的解决办法将在以后的文章中给出.

    展开全文
  • 原文链接 ... https://www.codeproject.com/Articles/4135/XZip-and-XUnzip-Add-zip-and-or-unzip-to-your-app-w 完全开源随便玩耍的一个老库库, 本文涉...

    原文链接

    https://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-simple-C-Win

    https://www.codeproject.com/Articles/4135/XZip-and-XUnzip-Add-zip-and-or-unzip-to-your-app-w

    完全开源随便玩耍的一个老库库,

    本文涉及IDE  VS2013  vc++6.0

    无需调用静态库或者动态库,直接包含即可使用 MFC 非MFC工程都可以没有限制,为了方便自身使用涉及这宝宝

    自己写个导出库使用,顺便作此文。

     

    --------------------------------------------------------------------------------------------------------------------------------------------------

    VS2013/VC++6.0(后面同称IDE) 

    取消预编译处理

    VC- 工程- C/C++ -预编译处理-不使用预补偿页眉

    VS-工程-C/C++-找到不使用预编译处理即可

     

    还有一点比较重要的这三者的顺序,如果不注意就报错了

    #include <winnt.h>
    #include "XUnzip.h"
    #include "XZip.h"

    好了配置好IDE然后就可以随便玩耍了,

    这个库里面有

    HZIP CreateZip(void *z, unsigned int len, DWORD flags);//创建一个空的zip

    Z:某路径下压缩文件名,无路径默认当前工作目录

    len:压缩内存的大小,其他情况为0

    flags:压缩文件使用标志 ZIP_FILENAME

    成功返回非0

     

    ZipAdd(HZIP hz, const TCHAR *dstzn, void *src, unsigned int len, DWORD flags);//将一个文件添加进行压缩

    hz:创建或者打开zip的文件指针

    dstzn:在zip文件中显示的文件名

    src:对于(ZIP_FILENAME 压缩)的情况,这个是需要添加到压缩包的文件的名字,需要给出具体的路径,若没有绝对路径那么默认当前工作目录下

    len:对于压缩内存的内容(ZIP_MEMORY)这是压缩内存的大小,其他情况,这个应该是0

    flags:如果是压缩文件,这个标志是ZIP_FILENAME

    returns:ZRESULT  成功为ZR_OK

     

    HZIP OpenZip(void *z, unsigned int len, DWORD flags);打开一个已经存在的压缩文件

    z:压缩文件名  【相对路径一般为当前工作目录】

    len:对于压缩内存的内容(ZIP_MEMORY)这是压缩内存的大小,其他情况,这个应该是0

    flags:如果是压缩文件,这个标志是ZIP_FILENAME

    returns: HZIP  非0为成功,0这是失败

     

    ZRESULT GetZipItemA(HZIP hz,int index,ZIPENTRY * ze);    //获取压缩文件里的信息
    ZRESULT GetZipItemW(HZIP hz,int index,ZIPENTRYW * ze);//获取压缩文件里的信息

    hz:创建/打开zip文件指针

    index:zip文件里的元素下标(0开始)

    ze:一个指向ZIPENTRY结构体指针(ANSI)或者ZIPENTRYW(Unicode宽字节)

    returns:ZRESULT  成功为ZR_OK

     

    ZRESULT FindZipItemA(HZIP hz, const TCHAR *name, bool ic, int *index, ZIPENTRY *ze);     //在压缩文件里查找某元素
    ZRESULT FindZipItemW(HZIP hz, const TCHAR *name, bool ic, int *index, ZIPENTRYW *ze);//在压缩文件里查找某元素

    hz:创建/打开zip文件指针

    name:需要在zip文件中查找的元素名字

    ic:值为TRUE大小写不敏感

    index:返回要查找元素的下标,否则是-1,

    ze:一个指向ZIPENTRY结构体指针(ANSI)或者ZIPENTRYW(Unicode宽字节)

    returns:ZRESULT  成功为ZR_OK

     

    ZRESULT UnzipItem(HZIP hz, int index, void *dst, unsigned int len, DWORD flags)  //解压压缩文件里面的某元素

    hz:创建/打开的zip文件指针

    index:要解压的元素下标

    dst:解压出来的文件名字

    len:对于压缩内容(ZIP_MEMORY)这个值是压缩内存的大小,其他情况,这个值应该是0

    flags:如果是压缩文件,那么使用这个标志ZIP_FILENAME

    returns:ZRESULT 成功返回ZR_OK

     

    ZRESULT CloseZipZ(HZIP hz);   //关闭压缩文件

    hz:要操作的zip文件指针

    returns:ZRESULT 成功返回ZR_OK

     

    注意压缩文件的路径,即可随心所欲压缩。

    转载于:https://www.cnblogs.com/liuruoqian/p/8232486.html

    展开全文
  • Windows中有很多可视化的解压工具,但是在Linux中,大多数都是命令行操作,所以相对应的也就有解压缩的命令:zip、unzip,不过这个命令不是自带的,需要手动安装。正好今天碰到一个,就给大家演示一下效果,也教一下...

    Windows中有很多可视化的解压工具,但是在Linux中,大多数都是命令行操作,所以相对应的也就有解压缩的命令:zip、unzip,不过这个命令不是自带的,需要手动安装。

    正好今天碰到一个,就给大家演示一下效果,也教一下大家如何在linux中安装zip、unzip工具。

    服务器上有一个jar包,是之前打包传上去的,但是数据库却连的不对,本来应该连到线上环境,但是却连到了测试环境,但是配置文件是抽出来打包到公共的config.jar中,所以想看一下也看不到,除非将config.jar下载到本地解压再反编译,但是这样无疑浪费了太多时间,而且也很麻烦。

    所以,就需要有一个linux中的解压缩工具,让我们可以直接在服务器上就能看到jar中的文件,从而快速定位问题,我直接敲了一个unzip,提示脚本不存在,因为这是一台新的服务器。

    [root@izbp165gqemaum7l4hq7p5z lib]# unzip config-1.0-SNAPSHOT.jar

    -bash: unzip: command not found

    那我们就来安装一个,由于时间关系,没有去找二进制安装包,所以直接使用yum命令来安装:

    [root@izbp165gqemaum7l4hq7p5z lib]# yum install -y unzip zip

    Loaded plugins: fastestmirror

    base | 3.6 kB 00:00:00

    epel | 4.7 kB 00:00:00

    extras | 3.4 kB 00:00:00

    updates | 3.4 kB 00:00:00

    (1/4): extras/7/x86_64/primary_db | 180 kB 00:00:00

    (2/4): epel/x86_64/updateinfo | 1.0 MB 00:00:00

    (3/4): updates/7/x86_64/primary_db | 3.2 MB 00:00:00

    (4/4): epel/x86_64/primary_db | 6.6 MB 00:00:00

    Determining fastest mirrors

    Resolving Dependencies

    --> Running transaction check

    ---> Package unzip.x86_64 0:6.0-19.el7 will be installed

    ---> Package zip.x86_64 0:3.0-11.el7 will be installed

    --> Finished Dependency Resolution

    Dependencies Resolved

    ===========================================================================================================================================================================================

    Package Arch Version Repository Size

    ===========================================================================================================================================================================================

    Installing:

    unzip x86_64 6.0-19.el7 base 170 k

    zip x86_64 3.0-11.el7 base 260 k

    Transaction Summary

    ===========================================================================================================================================================================================

    Install 2 Packages

    Total download size: 430 k

    Installed size: 1.1 M

    Downloading packages:

    (1/2): unzip-6.0-19.el7.x86_64.rpm | 170 kB 00:00:00

    (2/2): zip-3.0-11.el7.x86_64.rpm | 260 kB 00:00:00

    -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

    Total 4.7 MB/s | 430 kB 00:00:00

    Running transaction check

    Running transaction test

    Transaction test succeeded

    Running transaction

    Installing : zip-3.0-11.el7.x86_64 1/2

    Installing : unzip-6.0-19.el7.x86_64 2/2

    Verifying : unzip-6.0-19.el7.x86_64 1/2

    Verifying : zip-3.0-11.el7.x86_64 2/2

    Installed:

    unzip.x86_64 0:6.0-19.el7 zip.x86_64 0:3.0-11.el7

    Complete!

    基本上不会怎么报错,安装成功了之后,我们再次输入unzip命令来解压config.jar(解压到指定目录,使用 -d 参数)

    [root@izbp165gqemaum7l4hq7p5z lib]# unzip config-1.0-SNAPSHOT.jar -d config

    Archive: config-1.0-SNAPSHOT.jar

    creating: config/META-INF/

    inflating: config/META-INF/MANIFEST.MF

    creating: config/spring/

    inflating: config/cos.properties

    inflating: config/freemarker.properties

    inflating: config/grid.properties

    inflating: config/jdbc.properties

    inflating: config/log4j2-1.xml

    inflating: config/log4j2.xml

    inflating: config/mogj.properties

    inflating: config/money.properties

    inflating: config/ossKey.properties

    inflating: config/ouath2.properties

    inflating: config/pinduoduo.properties

    inflating: config/redis.properties

    inflating: config/spring/mybatis-config.xml

    inflating: config/spring/spring-init.xml

    inflating: config/spring/spring-redis.xml

    inflating: config/weixin.properties

    creating: config/META-INF/maven/

    creating: config/META-INF/maven/com.wo.money/

    creating: config/META-INF/maven/com.wo.money/config/

    inflating: config/META-INF/maven/com.wo.money/config/pom.xml

    inflating: config/META-INF/maven/com.wo.money/config/pom.properties

    再次查看目录,就可以看到一个config文件夹了

    此时,我们就可以看到原本jar中的内容了,对于我们解决问题的效率,提高的不是一点儿半点儿!

    展开全文
  • VC zip压缩解压程序

    2020-09-10 14:00:17
    使用VC实现zip的压缩、解压功能,支持文件、文件夹、密码。 VC use zip unzip and document compression and decompression code, support file, directory.
  • 前言项目中要用到一个压缩解压缩的模块,看了很...实现文件夹压缩解压缩即可.(不提供单文件压缩和内存压缩)4.压缩格式ZIP.5.具有一定的容错能力.(判断用户输入的内容)代码如下:*********************ZipImplement.h...

    前言

    项目中要用到一个压缩解压缩的模块,

    看了很多文章和源代码,

    都不是很称心, 现在把我自己实现的代码和大家分享.

    要求:

    1.使用Unicode(支持中文).

    2.使用源代码.(不使用静态或者动态库)

    3.实现文件夹压缩解压缩即可.(不提供单文件压缩和内存压缩)

    4.压缩格式为ZIP.

    5.具有一定的容错能力.(判断用户输入的内容)

    代码如下:

    *********************ZipImplement.h********************

    1/

    2// 文件名:

    3// 创建者:

    4// 创建日期: 2009-09-27 下午

    04:51:46

    5//

    6// 说明:压缩解压缩地图文件夹

    7/

    8

    9#pragma once

    10

    11#include "zip.h"

    12#include "unzip.h"

    13

    14class CZipImplement

    15{

    16public:

    17  CZipImplement(void);

    18  ~CZipImplement(void);

    19

    20private:

    21  HZIP hz;

    //Zip文件句柄

    22  ZRESULT zr;

    //操作返回值

    23  ZIPENTRY ze;

    //Zip文件入口

    24

    25  CString m_FolderPath;

    //folder路径

    26  CString

    m_FolderName;

    //folder将要被压缩的文件夹名

    27

    28private:

    29  //实现遍历文件夹

    30  void

    BrowseFile(CString

    &strFile);

    31

    32  //获取相对路径

    33  void

    GetRelativePath(CString& pFullPath,

    CString& pSubString);

    34

    35  //创建路径

    36  BOOL

    CreatedMultipleDirectory(wchar_t* direct);

    37  //

    43  //TCHAR*

    CString2TCHAR(CString &str)

    44  //{

    45  //  int iLen =

    str.GetLength();

    46  //  TCHAR* szRs = new

    TCHAR[iLen];

    47  //  lstrcpy(szRs,

    str.GetBuffer(iLen));

    48  //  str.ReleaseBuffer();

    49  //  return szRs;

    50  //}

    51

    52public:

    53  //压缩文件夹接口

    54  BOOL

    Zip_PackFiles(CString& pFilePath,

    CString& mZipFileFullPath);

    55

    56  //解压缩文件夹接口

    57  BOOL

    Zip_UnPackFiles(CString &mZipFileFullPath,

    CString& mUnPackPath);

    58

    59public:

    60  //静态方法提供文件夹路径检查

    61  static BOOL

    FolderExist(CString&

    strPath);

    62};

    *********************ZipImplement.cpp*********************

    1/

    2// 文件名:

    3// 创建者:

    4// 创建日期: 2009-09-27 下午

    04:51:46

    5//

    6// 说明:压缩解压缩地图文件夹

    7/

    8

    9#include

    "StdAfx.h"

    10#include

    "zipimplement.h"

    11#include

    12#include

    13#include

    14

    15CZipImplement::CZipImplement(void)

    16{

    17}

    18

    19CZipImplement::~CZipImplement(void)

    20{

    21}

    22

    23/

    24// 函数说明: 实现压缩文件夹操作

    25// 参数说明: [in]: pFilePath

    要被压缩的文件夹

    26//  mZipFileFullPath

    压缩后的文件名和路径

    27// 返回值:

    参数有误的情况下返回FALSE,压缩成功后返回TRUE

    28// 函数作者:

    29// 创建日期: 2009-09-27 下午

    04:58:52

    30/

    31BOOL

    CZipImplement::Zip_PackFiles(CString& pFilePath,

    CString& mZipFileFullPath)

    32{

    33  //参数错误

    34  if

    ((pFilePath == L"") || (mZipFileFullPath ==

    L""))

    35  {

    36  //路径异常返回

    37  return FALSE

    ;

    38  }

    39

    40  if(!CZipImplement::FolderExist(pFilePath))

    41  {

    42  //要被压缩的文件夹不存在

    43  return FALSE

    ;

    44  }

    45

    46  CString tZipFilePath =

    mZipFileFullPath.Left(mZipFileFullPath.ReverseFind('\\') +

    1);

    47  if(!CZipImplement::FolderExist(tZipFilePath))

    48  {

    49  //ZIP文件存放的文件夹不存在创建它

    50  wchar_t*

    temp=tZipFilePath.GetBuffer(tZipFilePath.GetLength());

    51  if (FALSE ==

    CreatedMultipleDirectory(temp))

    52  {

    53  //创建目录失败

    54  return FALSE;

    55  }

    56  }

    57

    58  //获得文件夹的名字

    59  if(pFilePath.Right(1) ==

    L"\")

    60  {

    61  this->m_FolderPath =

    pFilePath.Left(pFilePath.GetLength() - 1);

    62  m_FolderName =

    m_FolderPath.Right(m_FolderPath.GetLength() -

    m_FolderPath.ReverseFind('\\') - 1);

    63  }

    64  else

    65  {

    66  this->m_FolderPath =

    pFilePath;

    67  m_FolderName =

    pFilePath.Right(pFilePath.GetLength() - pFilePath.ReverseFind('\\')

    - 1);

    68  }

    69

    70

    71

    72  //创建ZIP文件

    73  hz=CreateZip(mZipFileFullPath,0);

    74  if(hz == 0)

    75  {

    76  //创建Zip文件失败

    77  return

    FALSE;

    78  }

    79

    80  //递归文件夹,将获取的问价加入ZIP文件

    81  BrowseFile(pFilePath);

    82  //关闭ZIP文件

    83  CloseZip(hz);

    84

    85

    86

    87  CFileFind tFFind;

    88  if

    (!tFFind.FindFile(mZipFileFullPath))

    89  {

    90  //压缩失败(未发现压缩后的文件)

    91  return

    FALSE;

    92  }

    93

    94  return TRUE;

    95}

    96

    97/

    98// 函数说明: 解压缩文件夹

    99// 参数说明: [in]: mUnPackPath

    解压后文件存放的路径

    100//  mZipFileFullPath  ZIP文件的路径

    101// 返回值:

    102// 函数作者:

    103// 创建日期: 2009-09-27 上午 11:04:28

    104/

    105BOOL CZipImplement::Zip_UnPackFiles(CString

    &mZipFileFullPath, CString&

    mUnPackPath)

    106{

    107  //参数错误

    108  if ((mUnPackPath ==

    L"") || (mZipFileFullPath == L""))

    109  {

    110  //路径异常返回

    111  return FALSE ;

    112  }

    113

    114  CFileFind

    tFFind;

    115  if

    (!tFFind.FindFile(mZipFileFullPath))

    116  {

    117  //压缩失败(未发现压缩文件)

    118  return FALSE;

    119  }

    120

    121  //如果解压缩的路径不存在

    试图创建它

    122  CString tZipFilePath

    = mUnPackPath;

    123  if(!CZipImplement::FolderExist(tZipFilePath))

    124  {

    125  //解压后存放的文件夹不存在 创建它

    126  wchar_t*

    temp=tZipFilePath.GetBuffer(tZipFilePath.GetLength());

    127  if (FALSE ==

    CreatedMultipleDirectory(temp))

    128  {

    129  //创建目录失败

    130  return

    FALSE;

    131  }

    132  }

    133

    134  //打开ZIP文件

    135  hz=OpenZip(mZipFileFullPath,0);

    136  if(hz ==

    0)

    137  {

    138  //打开Zip文件失败

    139  return FALSE;

    140  }

    141

    142  zr=SetUnzipBaseDir(hz,mUnPackPath);

    143  if(zr !=

    ZR_OK)

    144  {

    145  //打开Zip文件失败

    146  CloseZip(hz);

    147  return FALSE;

    148  }

    149

    150  zr=GetZipItem(hz,-1,&ze);

    151  if(zr !=

    ZR_OK)

    152  {

    153  //获取Zip文件内容失败

    154  CloseZip(hz);

    155  return FALSE;

    156  }

    157

    158  int

    numitems=ze.index;

    159  for (int i=0;

    i

    160  {

    161  zr=GetZipItem(hz,i,&ze);

    162  zr=UnzipItem(hz,i,ze.name);

    163

    164  if(zr != ZR_OK)

    165  {

    166  //获取Zip文件内容失败

    167  CloseZip(hz);

    168  return

    FALSE;

    169  }

    170  }

    171

    172  CloseZip(hz);

    173  return

    TRUE;

    174}

    175

    176/

    177// 函数说明: 检查指定的文件夹是否存在

    178// 参数说明: [in]:strPath 检查的文件夹

    (此方法会主动向路径末尾添加*.*)

    179// 返回值:BOOL类型,存在返回TRUE,否则为FALSE

    180// 函数作者:

    181// 创建日期: 2009-09-27 下午 02:16:36

    182/

    183BOOL CZipImplement::FolderExist(CString&

    strPath)

    184{

    185  CString sCheckPath =

    strPath;

    186

    187  if(sCheckPath.Right(1) !=

    L"\")

    188  sCheckPath += L"\";

    189

    190  sCheckPath +=

    L"*.*";

    191

    192  WIN32_FIND_DATA

    wfd;

    193  BOOL rValue =

    FALSE;

    194

    195  HANDLE hFind =

    FindFirstFile(sCheckPath,

    &wfd);

    196

    197  if

    ((hFind!=INVALID_HANDLE_VALUE)

    &&

    198  (wfd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)

    ||

    (wfd.dwFileAttributes&FILE_ATTRIBUTE_ARCHIVE))

    199  {

    200  //如果存在并类型是文件夹

    201  rValue = TRUE;

    202  }

    203

    204  FindClose(hFind);

    205  return

    rValue;

    206}

    207

    208/

    209// 函数说明: 遍历文件夹

    210// 参数说明: [in]:strFile

    遍历的文件夹(此方法会主动向路径末尾添加*.*)

    211// 返回值:BOOL类型,存在返回TRUE,否则为FALSE

    212// 函数作者:

    213// 创建日期: 2009-09-27 下午 02:16:36

    214/

    215void CZipImplement::BrowseFile(CString

    &strFile)

    216{

    217  CFileFind

    ff;

    218  CString szDir =

    strFile;

    219

    220  if(szDir.Right(1) !=

    L"\")

    221  szDir += L"\";

    222

    223  szDir +=

    L"*.*";

    224

    225  BOOL res =

    ff.FindFile(szDir);

    226  while(res)

    227  {

    228  res = ff.FindNextFile();

    229  if(ff.IsDirectory()

    &&

    !ff.IsDots())

    230  {

    231  //如果是一个子目录,用递归继续往深一层找

    232  CString

    strPath = ff.GetFilePath();

    233

    234  CString

    subPath;

    235  GetRelativePath(strPath,subPath);

    236  //将文件添加到ZIP文件

    237  ZipAddFolder(hz,subPath);

    238  BrowseFile(strPath);

    239  }

    240  else if(!ff.IsDirectory()

    &&

    !ff.IsDots())

    241  {

    242  //显示当前访问的文件(完整路径)

    243  CString

    strPath = ff.GetFilePath();

    244  CString

    subPath;

    245

    246  GetRelativePath(strPath,subPath);

    247  //将文件添加到ZIP文件

    248  ZipAdd(hz,subPath,strPath);

    249  }

    250  }

    251

    252  //关闭

    253  ff.Close();

    254}

    255

    256/

    257// 函数说明: 获取相对路径

    258// 参数说明: [in]:pFullPath 当前文件的完整路径 [out] :

    解析后的相对路径

    259// 函数作者:

    260// 创建日期: 2009-9-28 上午 11:17:21

    261/

    262void

    CZipImplement::GetRelativePath(CString&

    pFullPath,CString&

    pSubString)

    263{

    264  pSubString =

    pFullPath.Right(pFullPath.GetLength() -

    this->m_FolderPath.GetLength() +

    this->m_FolderName.GetLength());

    265}

    266

    267/

    268// 函数说明: 创建多级目录

    269// 参数说明: [in]: 路径字符串

    270// 返回值: BOOL 成功True 失败False

    271// 函数作者:

    272// 创建日期: 2009-9-28 下午 04:53:20

    273/

    274BOOL CZipImplement::CreatedMultipleDirectory(wchar_t*

    direct)

    275{

    276  std::wstring

    Directoryname = direct;

    277

    278  if

    (Directoryname[Directoryname.length() - 1] !=

    '\\')

    279  {

    280  Directoryname.append(1,

    '\\');

    281  }

    282  std::vector<

    std::wstring> vpath;

    283  std::wstring

    strtemp;

    284  BOOL

    bSuccess = FALSE;

    285  for (int i = 0; i

    < Directoryname.length();

    i++)

    286  {

    287  if ( Directoryname[i] !=

    '\\')

    288  {

    289  strtemp.append(1,Directoryname[i]);

    290  }

    291  else

    292  {

    293  vpath.push_back(strtemp);

    294  strtemp.append(1, '\\');

    295  }

    296  }

    297  std::vector<:wstring>::

    const_iterator vIter;

    298  for (vIter =

    vpath.begin();vIter != vpath.end();

    vIter++)

    299  {

    300  bSuccess =

    CreateDirectory(vIter->c_str(), NULL) ? TRUE

    :FALSE;

    301  }

    302

    303  return

    bSuccess;

    304}

    =====================以上为源代码=====================

    简单说明:

    1.使用VS2003编写.

    2.WinXp sp2下运行测试通过.

    3.为了简化算法,使用了很多MFC提供的函数, 如果要移植到标准C++请重新实现部分函数.

    4.压缩算法采用了ljw1004 这位高手的算法.

    5."zip.h" 和 "unzip.h"以及实现请至

    http://www.codeproject.com/KB/files/zip_utils.aspx 下载,

    下载的源文件中有示例程序可以参考.

    将下载后的 zip.h unzip.h

    zip.cpp unzip.cpp 添加到自己的项目中.

    展开全文
  • zip命令用法 将A1/B1/里的a1.txt b1.txt压缩到zip文件,包括文件夹 zip -r haha.zip A1zip命令用法   unzip命令用法 A2/A1/B1/中含有 a1.txt b1.txt c1.txt 将上面的压缩的haha....
  • 其中#include "zip.h" 以及 #include "unzip.h" 开源软件中代码,自己可以在网上下载.    //*****************************************************************************ZipImplement.h************...
  • VC++ MFC 如何用 CZip CUnzip类压缩解压缩文件 包括源代码和Example文件,还有说明文件~
  • IBM Spectrum Symphony是基于SOA架构的分布式计算框架,它能在自由伸缩的共享集群中,计算密集型和数据密集型的应用提供强大的企业级管理。 Symphony有一个配置是这样的,在应用的profile里头,有个方法是...
  • 使用VC++压缩解压缩文件夹

    千次阅读 2013-09-09 14:38:23
    前言  项目中要用到一个压缩解压缩的模块, 看了很多文章和源代码,  都不是很称心, 现在把我自己实现的代码和大家分享. 要求: ... 1.... 2.... 3.实现文件夹压缩解压缩即可.(不提供单文件压缩和内存...压缩格式ZIP.
  • VC++压缩解压zip文件(支持密码)

    千次阅读 2015-10-08 22:54:04
    只能压缩解压zip格式的,不需要dll或者库文件,核心是HZIP,支持带密码压缩解压。 //压缩 CZipImplement compress; compress.Zip_PackFiles(m_strDirPath,...//解压 CZipImplement compress; compress.Zip_UnPack
  • vc获取计算机名和ip地址的方法本文实例讲述了vc获取计算机名和ip地址的方法。分享给大家供大家参考。具体实现方法如下:#include #include #pragma comment(lib,"ws2_32.lib")void main(){WSADATA wsadata;WORD ...
  • zlib是当今应用最广泛的压缩与解压缩.zip文件的免费库之一,zlib是一种事实上的业界标准,而且用法简单,对于有密码的zip文件也能轻松应对(当然我们首先得知道解压所需的密码)。   下面我将讲解一下如何用...
  • 文件说明: File Tool - “文件”修复工具,问题三要用到 VC++6.0执行文件 - WIN7/8/10可用的VC6执行文件 ... 下载VC6.0green.rar,解压至D:\Program Files (x86)\Microsoft Visual Studi...
  • php 解压zip/rar

    千次阅读 2017-08-03 11:17:57
    刚开始学习php,在做php在线解压...2. 后来把压缩包解压到指定的目录中,在读取指定目录指定文件夹(压缩包名)的目录结构,之后删除该文件 3. 在线解压zip可以使用php自带的ZipAchive 参考:http://www.jb51.net/artic
  • 针对于windows用户装了office visio vc++6.0会不能够打开工程项目的解决方案。 我用原博主的方法成功安装上去了的。感谢。 不少使用过Microsoft Visual c++ 6.0的同学可能会遇到这样一个烦人的问题,无论是工具...
  • 自带minizip,在\contrib\minizip目录下面,由于zlib本身只是对字符串进行了编码压缩(有的人说zlib一次只能压缩一个文件,无法压缩多个文件,自己没有验证,不知道哪种说法正确),不满足直接打包压缩文件或文件夹的...
  • 嵌入式SQL实验报告实验目的:熟悉通过嵌入式SQL(主语言C/C++)访问数据库。实验平台:数据库管理系统:SQL Server 2000相应数据库的预编译器:nsqlprep.exeC\C++编译器Microsoft Visual C++ 6.0Window 7系统PC实验...
  • VC++ 解压有密码的.zip文件

    千次阅读 2015-12-03 14:29:46
    据说对.rar文件的解压是没有开源库的,而且好多软件都是收费的,因此这里便不再探讨对.rar文件的解压,下面研究一下.zip文件。    不可否认,zlib是当今应用最广泛的压缩与解压缩.zip文件的免费库之一,zlib是一...
  • linux复制目录(文件夹)和打包命令复制目录命令: cp 需要复制的目录 -r 目的目录 (注意带参数-r)压缩文件:zip -r 压缩文件名 需要压缩的目录喎?...
  • 在网上查阅了相关的资料,最终使用zlib开源库实现了该功能。本文将对zlib开源库进行简单介绍,并给出一个使用zlib开源库对zip压缩文件进行解压的示例程序。   1.zlib开源库  zlib是应用最广泛的压缩与解压缩...
  • 1、下载FileTool.exe,并解压。微软下载地址 点击打开,修改解压目录并点击“unzip解压 2. 打开VC6.0,点击“文件-打开工作空间”,选择刚解压出来的FileTool.dsw 3. 点击“Build”生成FileTool.dll文件,最好...
  • VC6.0

    2012-08-28 21:48:30
    vc6.0 打开文件的时候出现Microsoft Visual C++:MSDEV.EXE 应用程序错误 分类: 编程 2012-01-04 11:06 681人阅读 评论(3) 收藏 举报  使用过Microsoft Visual C++6.0的朋友可能有过这样的经历:...
  • WeexBox 快速上手

    2018-12-21 11:44:14
    UpdateManager.UpdateState.Unzip -> // 解压 UpdateManager.UpdateState.DownloadFile -> // 下载 UpdateManager.UpdateState.UpdateSuccess -> { // 更新成功,可以进入APP // 如果开启了强制更新,会等到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 970
精华内容 388
关键字:

vcunzip解压后文件夹为空