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

要求:

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. Multiple bindings were found on the class path(转)

    Multiple bindings were found on the class path SLF4J API is designed to bind with one and only one u ...

  2. C++界面库

    刚开始用C++做界面的时候,根本不知道怎么用简陋的MFC控件做出比较美观的界面,后来就开始逐渐接触到BCG  Xtreme ToolkitPro v15.0.1,Skin++,等界面库,以及一些网友自 ...

  3. Perl 5 教程

    Perl 5 教程 http://www.cbi.pku.edu.cn/chinese/documents/perl/index.htm

  4. Java基础05 实施接口

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在封装与接口中,private关键字封装了对象的内部成员.经过封装,产品隐藏了内部 ...

  5. javascript笔记整理(DOM对象)

    DOM--document(html xml) object modle,document对象(DOM核心对象),document对象是 Window 对象的一部分,可通过window.documen ...

  6. Android 解屏幕锁与点亮屏幕

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  7. Research notes for Scientific Writing

    Noun. complacency n. 自得;自鸣得意 nomenclature  n. 专业术语:e.g. the nomenclature of music; 音乐的专门术语 Verb. abs ...

  8. android 打包 /${zipalign}&quot; error=2, No such file or directory

    当我更新完android L proview之后我的打包出问题了,报错/${zipalign}" error=2, No such file or directory 排查了一下午才知道 近 ...

  9. 浅谈Jquery的使用下篇

    上一篇我们已经探讨了Jquery的有关的内容,简单的选择器以及一些Jquery的属性事件和方法等内容,让我们简单的学到了Jquery的比较基础的内容,下面我们就来探讨Jquery的一些其它的内容,比如 ...

  10. 我是小白之<%%>用法

    下面知识都是摘录自网络 <%=   %>输出,等价于Response.Write()<%%>  写代码<%-- --%>注释. <% %>跟其它serv ...