天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 57|回复: 0

MFC下实现压缩和解压缩功能

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-6-22 09:46:18 | 显示全部楼层 |阅读模式
递归压缩文件夹和文件

    /*!
         * @brief 将一个文件夹下的文件添加到压缩文件
         *
         * @param const HZIP& zip 压缩操作对象
         * @param const CString& zipPath 被压缩的文件或文件夹路径
         * @param const CString& filePath 压缩文件路径
         *
         * @return bool 压缩成功返回true
         *
         * @author 刘杰达
         * @date 2020年11月20日
         */
bool _compressedFolder(const HZIP &zip, const CString &zipPath, const CString &filePath)
{
        bool ret = false;
        //AfxMessageBox(_T("开始压缩文件夹内文件"));
        if(zip)
        {
                CFileFind finder;
        BOOL bWorking = finder.FindFile(zipPath + _T("\\*.*"));
        //AfxMessageBox(_T("压缩操作对象有效"));
                while(bWorking)
                {
                        bWorking = finder.FindNextFile();
                        CString strPath = finder.GetFilePath();
                        if(finder.IsDirectory() && !finder.IsDots())
                        {
                                // 文件夹递归调用
                _compressedFolder(zip, finder.GetFilePath(), filePath);
                        }
                        else if(!finder.IsDirectory() && !finder.IsDots())
                        {
                                // 文件添加到文件压缩文件
                                CString relatePath = _getRelateFolder(strPath, filePath);
                relatePath += finder.GetFileName();
                ZipAdd(zip, relatePath, strPath);
                                //ZipAdd(zip, finder.GetFileName(), strPath);
                                //AfxMessageBox(_T("压入文件:") + strPath + _T(",相对路径:") + relatePath);
                        }
                }
        }
        else
        {
                AfxMessageBox(_T("压缩对象无效"));
        }

        return ret;
}

    /*!
     * @brief 创建压缩文件
     *
     * @param const CString& zipPath 将要压缩的文件或文件夹路径
     * @param const CString& filePath 压缩后生成压缩文件路径
     *
     * @return bool 成功返回true
     *
     * @author 刘杰达
     * @email [email]991516973@qq.com[/email]
     * @date 2020年11月19日
     */
bool compressedFile(const CString& zipPath, const CString& filePath)
{
    CFileFind find;
    if (!PathFileExists(zipPath))
        return false;
    HZIP hz = CreateZip(filePath, 0);
    if (GetFileAttributes(zipPath) == FILE_ATTRIBUTE_DIRECTORY)
        _compressedFolder(hz, zipPath, filePath);
    else
    {
        CString fileName = zipPath.Right(zipPath.ReverseFind('\\'));
        ZipAdd(hz, fileName, zipPath);
    }

    CloseZip(hz);
    return true;
}

解压缩

    /*!
     * @brief 创建压缩文件,运行结果是把压缩文件解压到当前路径下
     *
     * @param const CString& filePath 压缩文件路径
     *
     * @return bool 成功返回true
     *
     * @author 刘杰达
     * @date 2020年11月19日
     */
bool Application::decompressionFile(const CString& filePath)
{
    bool ret = false;
    CFileFind finder;
    if (finder.FindFile(filePath))
    {
        HZIP hz = OpenZip(filePath, 0);
        ZIPENTRY ze;
        CString dir = finder.GetRoot();

        GetZipItem(hz, -1, &ze);
        int numitems = ze.index;
        for (int zi = 0; zi < numitems; zi++)
        {
            ZIPENTRY ze;
            GetZipItem(hz, zi, &ze);
            UnzipItem(hz, zi, dir + _T("\\") + ze.name);
        }
        ret = true;
        CloseZip(hz);
    }

    return ret;
}

获取文件相对于压缩文件的行对路径

    /*!
         * @brief 获取文件相对于压缩文件的行对路径
         *  C:\\a\\b\\c.txt  C:\\a\\d.zip 返回\\b
         *
         * @param const CString& compressedFile 被压缩文件路径
         * @param const CString& zipFile 压缩文件路径
         *
         * @date 2020年11月20日
         */
        CString _getRelateFolder(const CString &compressedFile, const CString &zipFile);

CString Application::_getRelateFolder(const CString &compressedFile, const CString &zipFile)
{
        CString result = _T("");
        CFileFind compressedFileFind, zipFileFind;
        if(compressedFileFind.FindFile(compressedFile) && zipFileFind.FindFile(zipFile))
        {
                CString compressedDir = compressedFileFind.GetRoot();
                CString zipDir = zipFileFind.GetRoot();
                compressedDir.Replace(zipDir, _T(""));
                result = compressedDir;
        }
        return result;
}

 

 

 

 

MFC下实现压缩和解压缩功能
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-1 11:48 , Processed in 0.147023 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表