c语言程序压缩解压缩文件夹,【转】使用VC++压缩解压缩文件夹
前言
项目中要用到一个压缩解压缩的模块,
看了很多文章和源代码,
都不是很称心, 现在把我自己实现的代码和大家分享.
要求:
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++压缩解压缩文件夹相关推荐
- secp256r1 c语言程序,区块链中的数学-secp256k1点压缩和公钥恢复原理
本节主要讲了secp256k1的参数,点表示形式和由签名试图恢复公钥的原理 ## 写在前面 上一节讲了[Schnorr离散对数签名及素数阶群构造(Schnorr群)](https://learnblo ...
- ccs读取dat文件c语言程序,TMS320DM642学习----第六篇(CCS中.dat文件类型详解)
1.如下为.dat文件中文件头的基本格式: MagicNumber Format StartingAddress PageNum Length [NewFormat] 下面是分别的解释: MagicN ...
- 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. ...
- Ubuntu下使用gcc和makefile编写c语言程序
文章目录 前言 一.gcc编写c语言程序 1.hello world的输出 2.简单程序的编译与运行 3.windows环境下的编译运行结果对比 二.makefile编写c语言程序 总结 前言 本文通 ...
- 最初编写的c语言程序称为,C语言程序设计复习参考答案
<C语言程序设计复习参考答案>由会员分享,可在线阅读,更多相关<C语言程序设计复习参考答案(46页珍藏版)>请在人人文库网上搜索. 1.随堂练习12]1. 下面哪些标识符属于合 ...
- python程序实现:linux环境下,将一个文件夹内的所有.tar.gz压缩文件解压缩到同名子文件夹内,没有子文件夹时重新建立同名子文件夹,使得它们相互独立。
# 命名为untar.pyimport tarfile import os# 获得目录下的所有文件 def get_file_name(file_dir):L = []for root, dirs, ...
- linux 文件夹tar.bz2压缩命令,使用tar命令提取(或解压缩)tar.bz2和tbz2文件的方法...
本文介绍使用tar命令提取(或解压缩)tar.bz2和tbz2文件的方法.tar命令允许你创建和提取tar归档文件,它支持各种压缩程序,例如gzip.bzip2.lzip.lzma.lzop.xz和c ...
- Java语言TAR文件(文件夹)批量打包压缩
最近项目中需要将文件和文件夹一起打包压缩为tar.gz文件,特此记录便于日后查阅. package com.openailab.oascloud.file.util;import org.apache ...
- vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩)
vb.net 解压缩(文件/文件夹解压缩,zip文件浏览,单文件解压,分卷压缩) DLL:Ionic.Zip.dll 说明: 1.解压/压缩 显示加密进度及总进度. 2.zip文件打开,浏览内部文件. ...
最新文章
- BZOJ 2156 「国家集训队」星际探索(最短路)【BZOJ计划】
- 自学python可以找到好的工作吗-通过自学python能找到工作吗
- 一些达成共识的JavaScript编码风格约定
- C++日志系统log4cxx使用总结
- 教师节特辑丨网易云信:素质教育「名师」是如何炼成的?
- python json模块rodas方法_json模块使用总结——Python
- 前端:JS/25/DOM官方定义,DOM分类,HTML节点树(节点关系,节点类型,),核心DOM中公共的属性和方法(节点访问,查找DOM节点,节点属性,节点的创建,追加和删除)
- 玩音响发烧友必看的博客
- Facebook改名,元宇宙非区块链不可
- android面试题整理(上)
- Mybatis-plus学习-最全细致讲解
- 【干货】电商知识图谱构建及搜索推荐场景下的应用.pdf(附下载链接)
- 零信任网络ZTNA及SDP概念理解 身份认证 安当加密
- 搭建自己的电影网站 2 (安装MacCMS10)
- Law of continuity
- 亲历NSDI 2013
- python中对列表的探讨(二)
- 验证性分析---相关假设检验
- 学计算机要学word跟什么,大学计算机word学习心得体会.doc
- Laravel 学习笔记 —— 神奇的服务容器
热门文章
- AprilTag: A robust and flexible visual fiducial system论文解读
- Android Studio学习开发笔记--基础
- python正则爬取微信阅读总榜单写入csv
- MySQL的文本导入load data local
- 驱动精灵 v9.61 去广告最终版绿色清爽单文件
- 防止电子元器件烧坏那些要避的坑
- Python带你面向对象爬取网易云音乐
- vb语言中怎样编码窗体中所有字体加粗_VBText控件中使字体加粗和倾斜的代码是什么...
- redis入门(三)
- 鸡年关于鸡的一些歇后语