使用zzip和minizip解压缩文件

  
    
#include < zzip / zzip.h >
#include
< zlib.h >
#include
< zip.h >
#include
< unzip.h >

#include
< string >
#include
< map >

#ifdef _DEBUG
#pragma comment( lib, "zlib_d.lib")
#pragma comment( lib, "zzip_d.lib")
#pragma comment( lib, "minizip_d.lib")
#else
#pragma comment( lib, "zlib.lib" )
#pragma comment( lib, "zzip.lib" )
#pragma comment( lib, "minizip.lib" )
#endif

#define SAFE_DELETEARRAY(p) if(p != NULL) { delete[] (p); (p) = NULL; };

void UnzipAndZip( const char * pScrFileName, const char * pDstFileName )
{
struct FILE_DESC
{
unsigned
char * pData;
size_t DataSize;
};

std::map
< std:: string , FILE_DESC > mapFileStreams;

ZZIP_DIR
* pZipDir = zzip_opendir( pScrFileName );
ZZIP_DIRENT
* pZipDirent = NULL;
while ( pZipDirent = zzip_readdir( pZipDir ) )
{
size_t length
= strlen(pZipDirent -> d_name);
if ( length > 0 )
{
if ( pZipDirent -> d_name[length - 1 ] != ' \\ ' &&
pZipDirent
-> d_name[length - 1 ] != ' / ' )
{
ZZIP_FILE
* pZipFile = zzip_file_open( pZipDir, pZipDirent -> d_name, ZZIP_CASELESS );
if ( pZipFile != NULL )
{
ZZIP_STAT sz;
memset(
& sz, 0 , sizeof (sz) );
zzip_file_stat( pZipFile,
& sz );
if ( sz.st_size > 0 )
{
unsigned
char * pBuffer = new unsigned char [sz.st_size];
zzip_file_read( pZipFile, pBuffer, sz.st_size );
FILE_DESC data
= { pBuffer, sz.st_size };
mapFileStreams[pZipDirent
-> d_name] = data;
}
zzip_file_close( pZipFile );
}
}
}
}
if ( pZipDir )
zzip_closedir( pZipDir );

zip_fileinfo ZipFileInfo;
zipFile ZipFile
= zipOpen( pDstFileName, 0 );

std::map
< std:: string , FILE_DESC > ::iterator iter =
mapFileStreams.begin();

while ( iter != mapFileStreams.end() )
{
int err = zipOpenNewFileInZip( ZipFile, iter -> first.c_str(),
& ZipFileInfo, NULL, 0 , NULL, 0 , NULL, 0 , 0 );
zipWriteInFileInZip( ZipFile, iter
-> second.pData, iter -> second.DataSize );
SAFE_DELETEARRAY( iter
-> second.pData );
++ iter;
}
zipClose( ZipFile, NULL );
}

int main( int argc, char * argv[])
{
UnzipAndZip(
" test.zip " , " dst.zip " );
return 0 ;
};

你可能感兴趣的:(zip)