前言

项目中要用到一个压缩解压缩的模块,

看了很多文章和源代码,

都不是很称心, 现在把我自己实现的代码和大家分享.

要求:

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

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

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

4.压缩格式为ZIP.

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

代码如下:

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

1/

2// 文件名:

3// 创建者:

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  //

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// 文件名:

3// 创建者:

4// 创建日期: 2009-09-27 下午

04:51:46

5//

6// 说明:压缩解压缩地图文件夹

7/

8

9#include

"StdAfx.h"

10#include

"zipimplement.h"

11#include

12#include

13#include

14

15CZipImplement::CZipImplement(void)

16{

17}

18

19CZipImplement::~CZipImplement(void)

20{

21}

22

23/

24// 函数说明: 实现压缩文件夹操作

25// 参数说明: [in]: pFilePath

要被压缩的文件夹

26//  mZipFileFullPath

压缩后的文件名和路径

27// 返回值:

参数有误的情况下返回FALSE,压缩成功后返回TRUE

28// 函数作者:

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// 函数作者:

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

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// 函数作者:

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// 函数作者:

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// 函数作者:

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// 函数作者:

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<: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 添加到自己的项目中.

c语言程序压缩解压缩文件夹,【转】使用VC++压缩解压缩文件夹相关推荐

  1. secp256r1 c语言程序,区块链中的数学-secp256k1点压缩和公钥恢复原理

    本节主要讲了secp256k1的参数,点表示形式和由签名试图恢复公钥的原理 ## 写在前面 上一节讲了[Schnorr离散对数签名及素数阶群构造(Schnorr群)](https://learnblo ...

  2. ccs读取dat文件c语言程序,TMS320DM642学习----第六篇(CCS中.dat文件类型详解)

    1.如下为.dat文件中文件头的基本格式: MagicNumber Format StartingAddress PageNum Length [NewFormat] 下面是分别的解释: MagicN ...

  3. VC6.0(VC++6.0)使用教程(使用VC6.0编写C语言程序)

    VC6.0(VC++6.0)使用教程(使用VC6.0编写C语言程序) Visual C++ 6.0简称VC或者VC6.0,是微软1998年推出的一款C/C++ IDE,界面友好,调试功能强大.VC6. ...

  4. Ubuntu下使用gcc和makefile编写c语言程序

    文章目录 前言 一.gcc编写c语言程序 1.hello world的输出 2.简单程序的编译与运行 3.windows环境下的编译运行结果对比 二.makefile编写c语言程序 总结 前言 本文通 ...

  5. 最初编写的c语言程序称为,C语言程序设计复习参考答案

    <C语言程序设计复习参考答案>由会员分享,可在线阅读,更多相关<C语言程序设计复习参考答案(46页珍藏版)>请在人人文库网上搜索. 1.随堂练习12]1. 下面哪些标识符属于合 ...

  6. python程序实现:linux环境下,将一个文件夹内的所有.tar.gz压缩文件解压缩到同名子文件夹内,没有子文件夹时重新建立同名子文件夹,使得它们相互独立。

    # 命名为untar.pyimport tarfile import os# 获得目录下的所有文件 def get_file_name(file_dir):L = []for root, dirs, ...

  7. linux 文件夹tar.bz2压缩命令,使用tar命令提取(或解压缩)tar.bz2和tbz2文件的方法...

    本文介绍使用tar命令提取(或解压缩)tar.bz2和tbz2文件的方法.tar命令允许你创建和提取tar归档文件,它支持各种压缩程序,例如gzip.bzip2.lzip.lzma.lzop.xz和c ...

  8. Java语言TAR文件(文件夹)批量打包压缩

    最近项目中需要将文件和文件夹一起打包压缩为tar.gz文件,特此记录便于日后查阅. package com.openailab.oascloud.file.util;import org.apache ...

  9. vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩)

    vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩) DLL:Ionic.Zip.dll 说明: 1.解压/压缩 显示加密进度及总进度. 2.zip文件打开,浏览内部文件. ...

最新文章

  1. BZOJ 2156 「国家集训队」星际探索(最短路)【BZOJ计划】
  2. 自学python可以找到好的工作吗-通过自学python能找到工作吗
  3. 一些达成共识的JavaScript编码风格约定
  4. C++日志系统log4cxx使用总结
  5. 教师节特辑丨网易云信:素质教育「名师」是如何炼成的?
  6. python json模块rodas方法_json模块使用总结——Python
  7. 前端:JS/25/DOM官方定义,DOM分类,HTML节点树(节点关系,节点类型,),核心DOM中公共的属性和方法(节点访问,查找DOM节点,节点属性,节点的创建,追加和删除)
  8. 玩音响发烧友必看的博客
  9. Facebook改名,元宇宙非区块链不可
  10. android面试题整理(上)
  11. Mybatis-plus学习-最全细致讲解
  12. 【干货】电商知识图谱构建及搜索推荐场景下的应用.pdf(附下载链接)
  13. 零信任网络ZTNA及SDP概念理解 身份认证 安当加密
  14. 搭建自己的电影网站 2 (安装MacCMS10)
  15. Law of continuity
  16. 亲历NSDI 2013
  17. python中对列表的探讨(二)
  18. 验证性分析---相关假设检验
  19. 学计算机要学word跟什么,大学计算机word学习心得体会.doc
  20. Laravel 学习笔记 —— 神奇的服务容器

热门文章

  1. AprilTag: A robust and flexible visual fiducial system论文解读
  2. Android Studio学习开发笔记--基础
  3. python正则爬取微信阅读总榜单写入csv
  4. MySQL的文本导入load data local
  5. 驱动精灵 v9.61 去广告最终版绿色清爽单文件
  6. 防止电子元器件烧坏那些要避的坑
  7. Python带你面向对象爬取网易云音乐
  8. vb语言中怎样编码窗体中所有字体加粗_VBText控件中使字体加粗和倾斜的代码是什么...
  9. redis入门(三)
  10. 鸡年关于鸡的一些歇后语