前言   项目中要用到一个压缩解压缩的模块, 看了很多文章和源代码, 
都不是很称心, 现在把我自己实现的代码和大家分享.

要求:

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

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

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

4.压缩格式为ZIP.

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

代码如下:

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



 1///////////////////////////////////////////////////////////////////////////// 
 2// 文件名: <ZipImplement.h> 
 3// 创建者: <hwfly> 
 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    ///* 
38    //*********************************************************************** 
39    //* 函数: TransCStringToTCHAR 
40    //* 描述:将CString 转换为 TCHAR* 
41    //*********************************************************************** 
42    //*/ 
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// 文件名: <ZipImplement.cpp> 
  3// 创建者: <hwfly> 
  4// 创建日期: 2009-09-27 下午 04:51:46 
  5// 
  6// 说明:压缩解压缩地图文件夹 
  7///////////////////////////////////////////////////////////////////////////// 
  8
  9#include "StdAfx.h" 
 10#include "zipimplement.h" 
 11#include <direct.h> 
 12#include <vector> 
 13#include <xstring> 
 14
 15CZipImplement::CZipImplement(void) 
 16
 17
 18
 19CZipImplement::~CZipImplement(void) 
 20
 21
 22
 23///////////////////////////////////////////////////////////////////////////// 
 24// 函数说明: 实现压缩文件夹操作 
 25// 参数说明: [in]: pFilePath         要被压缩的文件夹 
 26//                         mZipFileFullPath  压缩后的文件名和路径 
 27// 返回值: 参数有误的情况下返回FALSE,压缩成功后返回TRUE 
 28// 函数作者: <hwfly> 
 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// 函数作者: <hwfly> 
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<numitems; 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// 函数作者: <hwfly> 
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// 函数作者: <hwfly> 
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// 函数作者: <hwfly> 
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// 函数作者: <hwfly> 
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<std::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 添加到自己的项目中.

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

使用VC++压缩解压缩文件夹的更多相关文章

  1. linux 压缩当前文件夹下所有文件

    linux zip压缩.压缩当前文件夹下所有文件,压缩为a.zip.命令行的方法是怎样. zip  -r fileName.zip  文件夹名 tar tar命令可以用来压缩打包单文件.多个文件.单个 ...

  2. Linux的压缩/解压缩文件处理 zip & unzip

    Linux的压缩/解压缩命令详解及实例 压缩服务器上当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip 另:有些服 ...

  3. albert1017 Linux下压缩某个文件夹(文件夹打包)

    albert1017 Linux下压缩某个文件夹(文件夹打包) tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把 ...

  4. VC 获取指定文件夹路径的方法小结

    VC获取指定文件夹路径 flyfish  2010-3-5 一 使用Shell函数 1 获取应用程序的安装路径 TCHAR buf[_MAX_PATH];SHGetSpecialFolderPath( ...

  5. shell 批量压缩指定文件夹及子文件夹内图片

    shell 批量压缩指定文件夹及子文件夹内图片 用户上传的图片,一般都没有经过压缩,造成空间浪费.因此须要编写一个程序,查找文件夹及子文件夹的图片文件(jpg,gif,png),将大于某值的图片进行压 ...

  6. python实现压缩当前文件夹下的所有文件

    import os import zipfile def zipDir(dirpath, outFullName): ''' 压缩指定文件夹 :param dirpath: 目标文件夹路径 :para ...

  7. gulp插件实现压缩一个文件夹下不同目录下的js文件(支持es6)

    gulp-uglify:压缩js大小,只支持es5 安装: cnpm: cnpm i gulp-uglify -D yarn: yarn add gulp-uglify -D 使用: 代码实现1:压缩 ...

  8. Linux下压缩某个文件夹(文件夹打包)

    tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把/xahot文件夹打包后生成一个/home/xahot.tar. ...

  9. 项目实战工具类(二):ZipUtils(压缩/解压缩文件相关)

    import android.content.Context; import android.util.Log; import java.io.File; import java.io.FileInp ...

随机推荐

  1. mysql字符串连接,重复等字符串函数总结

    mysql concat()函数 MySQL的concat函数可以连接一个或者多个字符串,如 select concat('10'); 输出 10 select concat('11','22','3 ...

  2. XSS学习笔记(四)-漏洞利用全过程

    <script type="text/javascript" reload="1">setTimeout("window.location ...

  3. android4.0蓝牙使能的详细解析 (转载)

    此博客是转载过来的哦... 给自己博客定几个部分: (1)写在前面的话:一些写博客时的废话. (2)内容简介:把文章的主要内容或者核心部分作一个框架性的概括,以方便大家阅读. (3)正文:这个不需要解 ...

  4. 基于visual Studio2013解决C语言竞赛题之1035最大数

          题目 解决代码及点评 /* 35. 用随机函数求出10组三位正整数,每组十个数, 调用一函数打印出每组数,并编一函数求出每组中的最大数. */ #include & ...

  5. 页面提交进不了Action的原因

    1.进不了action,页面没有任何js报错,可能的原因是数据类型不一致.例如用ajax方式提交所带的参数类型a是String类型,而action中定义的a是Integer类型就会导致这种情况的发生.

  6. POJ 2187 Beauty Contest 凸包

    Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 27276   Accepted: 8432 D ...

  7. PS大头照的背景

    给同事ps一个大头照,只是修改一下背景颜色,以前没有做过,这次算是小练习了一把,与大家分享一下.修改大头照背景重要的是如何选中背景的区域,如果用魔棒选择的话,头与背景的边处理的不好,说说我的处理方法吧 ...

  8. 原码、反码、补码和移码事实上非常easy

    近期在备战软考,复习到计算机组成原理的时候,看到书中关于原码.反码.补码和移码的定义例如以下(n是机器字长): 原码: 反码: 补码: 移码: 看完这些定义以后,我的脑袋瞬间膨胀到原来的二倍!这样变态 ...

  9. EasyUI - DataGrid 组建 - [ 组件加载和分页 ]

    效果: 原理:通过POST传递到数据后台字段. 此时上传的参数,page:当前页数,rows:每页显示的页数. 有此两项参数,计算取出数据条数. 通过后台接受参数,进行处理并返回抽取的数据. html ...

  10. sqlserver05 字符串拆分

    -- 规则:将 gs-abc-aa-aa 拆分为一下字符 -- gs-abc-aa-aa -- gs-abc-aa -- gs-abc -- gs select * from dbo.f_split( ...