close
文章出處
最近需要修改以前做的一個下載程序,主要是增加壓縮和解壓的功能,以減少網絡帶寬的消耗.去論壇咨詢了一下網友,于是借助開源庫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;
}
* 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();
if( !zipArchive.Open( _T("D:\\手繪古景.zip") , CZipArchive::zipCreate ) )
return;
//壓縮目錄下的所有文件,第三個參數指示是否遞歸壓縮子目錄,第五個參數指示是否連文件夾目錄一起壓縮
zipArchive.AddNewFiles( _T("D:\\手繪古景\\"), _T("*.*"), true, -1, false );
zipArchive.Close();
![]() |
不含病毒。www.avast.com |
全站熱搜