使用VC++压缩解压缩文件夹
前言 项目中要用到一个压缩解压缩的模块, 看了很多文章和源代码,
都不是很称心, 现在把我自己实现的代码和大家分享.
要求:
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

14
class CZipImplement 15
{ 16
public: 17
CZipImplement(void); 18
~CZipImplement(void); 19

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

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

28
private: 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

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

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

59
public: 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

15
CZipImplement::CZipImplement(void) 16
{ 17
} 18

19
CZipImplement::~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
///////////////////////////////////////////////////////////////////////////// 31
BOOL 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
///////////////////////////////////////////////////////////////////////////// 105
BOOL 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
///////////////////////////////////////////////////////////////////////////// 183
BOOL 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
///////////////////////////////////////////////////////////////////////////// 215
void 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
///////////////////////////////////////////////////////////////////////////// 262
void 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
///////////////////////////////////////////////////////////////////////////// 274
BOOL 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++压缩解压缩文件夹的更多相关文章
- linux 压缩当前文件夹下所有文件
linux zip压缩.压缩当前文件夹下所有文件,压缩为a.zip.命令行的方法是怎样. zip -r fileName.zip 文件夹名 tar tar命令可以用来压缩打包单文件.多个文件.单个 ...
- Linux的压缩/解压缩文件处理 zip & unzip
Linux的压缩/解压缩命令详解及实例 压缩服务器上当前目录的内容为xxx.zip文件 zip -r xxx.zip ./* 解压zip文件到当前目录 unzip filename.zip 另:有些服 ...
- albert1017 Linux下压缩某个文件夹(文件夹打包)
albert1017 Linux下压缩某个文件夹(文件夹打包) tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把 ...
- VC 获取指定文件夹路径的方法小结
VC获取指定文件夹路径 flyfish 2010-3-5 一 使用Shell函数 1 获取应用程序的安装路径 TCHAR buf[_MAX_PATH];SHGetSpecialFolderPath( ...
- shell 批量压缩指定文件夹及子文件夹内图片
shell 批量压缩指定文件夹及子文件夹内图片 用户上传的图片,一般都没有经过压缩,造成空间浪费.因此须要编写一个程序,查找文件夹及子文件夹的图片文件(jpg,gif,png),将大于某值的图片进行压 ...
- python实现压缩当前文件夹下的所有文件
import os import zipfile def zipDir(dirpath, outFullName): ''' 压缩指定文件夹 :param dirpath: 目标文件夹路径 :para ...
- gulp插件实现压缩一个文件夹下不同目录下的js文件(支持es6)
gulp-uglify:压缩js大小,只支持es5 安装: cnpm: cnpm i gulp-uglify -D yarn: yarn add gulp-uglify -D 使用: 代码实现1:压缩 ...
- Linux下压缩某个文件夹(文件夹打包)
tar -zcvf /home/xahot.tar.gz /xahottar -zcvf 打包后生成的文件名全路径 要打包的目录例子:把/xahot文件夹打包后生成一个/home/xahot.tar. ...
- 项目实战工具类(二):ZipUtils(压缩/解压缩文件相关)
import android.content.Context; import android.util.Log; import java.io.File; import java.io.FileInp ...
随机推荐
- 演练2-4:CodeFirst实例之“电影网站制作”
原文出处:http://www.asp.net/mvc/tutorials/mvc-4/getting-started-with-aspnet-mvc4/adding-a-model EntityFr ...
- cocos2d-x游戏开发系列教程-坦克大战游戏之所有坦克之间的碰撞检测
上篇我们完成了简单的AI编写,但是各个坦克移动时之间是可以重合的, 这节课我们来完成坦克之间的碰撞检测,还是在上篇的EnemyAI中完成. 1.我先现在坦克类Tank中添加两个成员变量: CC_SYN ...
- 找出并解决 JavaScript 和 Dojo 引起的浏览器内存泄露问题
简介: 如果大量使用 JavaScript 和 Ajax 技术开发 Web 2.0 应用程序,您很有可能会遇到浏览器的内存泄漏问题.如果您有一个单页应用程序或者一个页面要处理很多 UI 操作,问题可能 ...
- poll系统调用的内核态实现机制分析
版权所有,转载请标明出处 All right reserved,Copyright by 徐行而至 浅唱而归 前面已经比较详尽的分析了系统调用引发的内核执行过程,本文将继续分析一下linux2.6 ...
- 使用数组实现队列----《数据结构与算法分析---C语言描述》
一.h文件:my_que.h #ifndef _MY_QUE_H_ #define _MY_QUE_H_ struct QueRecord; typedef struct QueRecord* que ...
- PHP - 递归函数
/** * factorial($num) 计算阶乘 * @param string $num * @return string $total */ function factorial($num) ...
- 阿根廷探戈舞会- 一起salsa百科 - 一起salsa网 - Powered by HDWiki!
阿根廷探戈舞会- 一起salsa百科 - 一起salsa网 - Powered by HDWiki! 阿根廷探戈舞会 编辑词条 发表评论(2) 目录 • 京城阿根廷探戈资源 • 上海阿根廷探戈 ...
- Java byte数据类型详解
public static String bytes2HexString(byte[] b) { String ret = ""; for (int i = 0; i < b ...
- 关于Delphi中TRttiContext.FindType失效的问题
自从Delphi2010后,Delphi中的Rtti功能得到了增强.我们终于可以不用先RegisterClass,再GetClass获取类的信息了.而只是简单的通过TRttiContext.GetTy ...
- IOS详解TableView——对话聊天布局的实现
上篇博客介绍了如何使用UITableView实现类似QQ的好友界面布局.这篇讲述如何利用自定义单元格来实现聊天界面的布局. 借助单元格实现聊天布局难度不大,主要要解决的问题有两个: 1.自己和其他人说 ...