最近需要修改以前做的一个下载程序,主要是增加压缩和解压的功能,以减少网络带宽的消耗.去论坛咨询了一下网友,于是借助开源库ZipArchive来实现我要的功能。
初步看了一下ZipArchive文档,简单地封装了一下压缩和解压功能.代码如下:
/*
* CompressZipFile: 压缩文件
* lpszFile: 需要压缩的文件
* lpszZipFile: 要压缩到的目标文件
* bAppend: 标志是否添加到现有压缩文件
* 返回压缩成功与否
*/
BOOL CompressZipFile( LPCTSTR lpszFile, LPCTSTR lpszZipFile, BOOL bAppend
=
FALSE )
{
//
如果是追加到现有压缩文件,但现有压缩文件不存在的话 直接返回失败
if
( bAppend
&&
(
!
::PathFileExists( lpszZipFile ) ) )
return
FALSE;
int
nMode
=
bAppend
?
CZipArchive::zipOpen : CZipArchive::zipCreate;
CZipArchive zipArchive;
if
(
!
zipArchive.Open( lpszZipFile, nMode ) )
return
FALSE;
//
获取路径中的文件名部分
TCHAR szFile[MAX_PATH];
lstrcpy( szFile, lpszFile );
::PathStripPath( szFile );
bool
bRet
=
zipArchive.AddNewFile( lpszFile, szFile );
zipArchive.Close();
return
bRet;
}
/*
* ExtractZipFile : 解压指定文件
* lpszZipFile: 要解压的文件
* lpszDestPath: 指定解压到的目录
* 返回压缩成功与否
*/
BOOL ExtractZipFile( LPCTSTR lpszZipFile, LPCTSTR lpszDestPath )
{
if
(
!
::PathFileExists( lpszZipFile ))
return
FALSE;
CZipArchive zipArchive;
if
(
!
zipArchive.Open( lpszZipFile, CZipArchive::zipOpenReadOnly ) )
return
FALSE;
for
(
int
nIndex
=
0
; nIndex
<
zipArchive.GetCount (); nIndex
++
)
{
if
(
!
zipArchive.ExtractFile( (WORD)nIndex, lpszDestPath ) )
break
;
}
zipArchive.Close();
return
TRUE;
}
压缩文件夹可以参考如下的Demo:
CZipArchive zipArchive;
if
(
!
zipArchive.Open( _T(
"
D:\\手绘古景.zip
"
) , CZipArchive::zipCreate ) )
return
;
//
压缩目录下的所有文件,第三个参数指示是否递归压缩子目录,第五个参数指示是否连文件夹目录一起压缩
zipArchive.AddNewFiles( _T(
"
D:\\手绘古景\\
"
), _T(
"
*.*
"
),
true
,
-
1
,
false
);
zipArchive.Close();