欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++Zip壓縮解壓縮示例(支持遞歸壓縮)

 更新時(shí)間:2013年11月24日 11:44:53   作者:  
C++Zip壓縮解壓縮示例,用第三方函數(shù)封裝而成,支持 UNCODE, ANSCII、支持壓縮文件夾、支持遞歸壓縮



第三方函數(shù)、頭文件、測(cè)試工程下載地址:http://pan.baidu.com/s/1gSfKo

復(fù)制代碼 代碼如下:

// 文件名: 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     - 解壓出來(lái)的文件 所存放位置的完整路徑; 如 “D://01”
    //                       此參數(shù)省略時(shí),默認(rèn)解壓到exe程序所在文件夾下。
    // Returns:
    //   解壓成功返回ZR_OK,解壓失敗返回錯(cuò)誤碼。
    // ------------------------------------------------------------------------------------------------------------------------
    ZRESULT ExtractZipToDir(LPCTSTR lpszZipFullName, CStringArray& szFilePathArr, LPCTSTR lpszUnZipPath = NULL);

    // ------------------------------------------------------------------------------------------------------------------------
    // Summary:
    //   壓縮指定路徑下的文件,并保存壓縮包到指定路徑。
    // Parameters:
    //   lpszSrcPath        - 待壓縮文件所在的路徑; 如"D://00"。
    //   lpszDestPath       - 壓縮完成后,存放壓縮包的路徑。
    //                        此參數(shù)省略時(shí),默認(rèn)存放路徑為exe程序所在文件的路徑。
    //   lpszZipName        - 壓縮完成后,壓縮的名稱;如“MySkin.zip”。
    // Returns:
    //   壓縮成功返回ZR_OK,壓縮失敗返回錯(cuò)誤碼。
    // ------------------------------------------------------------------------------------------------------------------------
    ZRESULT CompressDirToZip(LPCTSTR lpszSrcPath, LPCTSTR lpszZipName, LPCTSTR lpszDestPath = NULL);
}

復(fù)制代碼 代碼如下:

#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())
        {
            // 如果文件路徑不存在先創(chuàng)建,存在不做任何修改
            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))   
                {
                    // 文件不存在的時(shí)候
                    return zResult;
                }
#else
                if (_access((char *)(LPTSTR)(LPCTSTR)szFilePathArr[zi], 0))   
                {
                    // 文件不存在的時(shí)候
                    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)
        {
            // 這里邊的只執(zhí)行一次
            if (!strDestPath.IsEmpty())
            {
                // 如果解壓路徑文件夾不存在 先創(chuàng)建,存在 不做任何修改
                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))
        {
            // 如果是一個(gè)文件目錄
            if(fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                if (strFileName.IsEmpty())
                {
                    ZipAddFolder(hz, fileData.cFileName);
                }
                else
                {
                    ZipAddFolder(hz, strFileName+_T("\\")+fileData.cFileName);
                }

                strFileName = fileData.cFileName;
                // 存在子文件夾 遞歸調(diào)用
                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;
    }
}

相關(guān)文章

  • 函數(shù)指針與指針函數(shù)的學(xué)習(xí)總結(jié)

    函數(shù)指針與指針函數(shù)的學(xué)習(xí)總結(jié)

    函數(shù)指針是指向函數(shù)的指針,指針函數(shù)是指一個(gè)函數(shù)的返回值是一個(gè)指針。以下就是對(duì)函數(shù)指針與指針函數(shù)的應(yīng)用進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07
  • 深入探討:main函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼?

    深入探討:main函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼?

    本篇文章是對(duì)main函數(shù)執(zhí)行完畢后,是否可能會(huì)再執(zhí)行一段代碼,進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C語(yǔ)言中自定義類型詳解

    C語(yǔ)言中自定義類型詳解

    大家好,本篇文章主要講的是C語(yǔ)言中自定義類型詳解,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • C語(yǔ)言各類操作符全面講解

    C語(yǔ)言各類操作符全面講解

    C?語(yǔ)言提供了豐富的操作符,有:算術(shù)操作符,移位操作符,位操作符,賦值操作符,單目操作符,關(guān)系操作符,邏輯操作符,條件操作符等。接下了讓我們?cè)敿?xì)了解掌握它
    2022-05-05
  • C++(STL庫(kù))之順序容器vector的使用

    C++(STL庫(kù))之順序容器vector的使用

    這篇文章主要介紹了C++(STL庫(kù))之順序容器vector的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • 枚舉和宏的區(qū)別詳細(xì)解析

    枚舉和宏的區(qū)別詳細(xì)解析

    枚舉常量具有類型,但宏沒(méi)有類型,枚舉變量具有與普通變量相同的諸如作用域、值等性質(zhì),但宏沒(méi)有,宏不是語(yǔ)言的一部分,它是一種預(yù)處理替換符
    2013-09-09
  • C++實(shí)現(xiàn)寢室衛(wèi)生管理系統(tǒng)

    C++實(shí)現(xiàn)寢室衛(wèi)生管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)寢室衛(wèi)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++中4種管理數(shù)據(jù)內(nèi)存的方式總結(jié)

    C++中4種管理數(shù)據(jù)內(nèi)存的方式總結(jié)

    根據(jù)用于分配內(nèi)存的方法,C++中有3中管理數(shù)據(jù)內(nèi)存的方式:自動(dòng)存儲(chǔ)、靜態(tài)存儲(chǔ)和動(dòng)態(tài)存儲(chǔ)。在存在時(shí)間的長(zhǎng)短方面,以這三種方式分配的數(shù)據(jù)對(duì)象各不相同。下面簡(jiǎn)要介紹這三種類型
    2022-09-09
  • C++深入講解類與對(duì)象之OOP面向?qū)ο缶幊膛c封裝

    C++深入講解類與對(duì)象之OOP面向?qū)ο缶幊膛c封裝

    學(xué)習(xí)過(guò)C語(yǔ)言的小伙伴知道:C語(yǔ)言是面向過(guò)程的,關(guān)注的是過(guò)程,分析出求解問(wèn)題的步驟,通過(guò)函數(shù)調(diào)用逐步解決問(wèn)題,接下來(lái)讓我們?cè)敿?xì)的了解
    2022-05-05
  • C語(yǔ)言實(shí)現(xiàn)生成新春福字的示例詳解

    C語(yǔ)言實(shí)現(xiàn)生成新春福字的示例詳解

    這篇文章主要介紹了如何利用C語(yǔ)言實(shí)現(xiàn)生成各個(gè)字體的新春福字,再也不用擔(dān)心支付寶掃福找不到圖片了,感興趣的同學(xué)可以跟隨小編學(xué)習(xí)一下
    2022-01-01

最新評(píng)論