前段時間一直在搞Qt解壓縮zip文件,在網上找了很多的方法,差不多都是一模一樣的代碼,都是簡潔扼要的東西,到最後啥都沒看懂,白白浪費了很多時間。網上很多的使用quazip開源源碼庫解壓和壓縮,但是quazip要自己編譯,而編譯又對軟件有要求,quazip支持的平臺有限,所以不能通用,下載的別人編譯好的 lib庫文件,又會因爲Qt版本的限制而不能用。
經過自己多天的研究,終於找到了Qt調用zlib解壓縮的方法,現將一些過程分享出來,一起學習。這裏只有解壓的源碼,壓縮和解壓差不多
- 先下載zlib的dll文件
http://download.csdn.net/detail/tax10240809163com/9469712 - 再下載zlib的zip文件,因爲要用到它的源碼
http://download.csdn.net/detail/tax10240809163com/9469715
/*上面的這兩個文件也可以直接在zlib官網下載/
http://www.zlib.net/ - 將dll解壓出來的dll.lib文件鏈接到你的工程中,具體用什麼工具就有什麼鏈接
- 把zlib128.zip裏面contrib\minizip目錄下的.c和.h源文件(除了minzip.c和minunz.c兩個文件外)拷貝出來放到Qt工程目錄下, Qt工程目錄添加這些.c文件進來。
- 接下來就是源碼了,這裏只有解壓的代碼:
/**
*返回值:將解壓出來的文件的絕對路徑保存在QStringList中
*
*參數:FileName是要解壓的zip文件的絕對路徑,QStringList其實也就是QList<QString> list類型用來保存解壓後各文件的路徑
*
*功能:解壓指定的zip文件並將解壓出來的文件的絕對路徑保存在list中
**/
void WidgetSmallClass::slot_UncompressedFile( QString FileName ,QStringList & ListPic )
{
/**新建一個文件夾,用來保存解壓後的文件*/
QString UnpressPath = FileName.remove( ".zip" );
QDir dir;
dir.mkpath( UnpressPath );
unz_file_info64 FileInfo;
/**打開zip文件,這裏記得一定要加上".zip",因爲在上面的時候已經將".zip"移出去了。*/
unzFile zFile = unzOpen64( ( FileName + ".zip" ).toStdString().c_str() );
unz_global_info64 gi;
/**獲取文件數量*/
if ( unzGetGlobalInfo64( zFile, &gi ) == UNZ_OK )
{
int result;
for ( int i = 0; i < gi.number_entry; ++i )
{
char file[256] = { 0 };
char ext[256] = { 0 };
char com[1024] = { 0 };
if ( unzGetCurrentFileInfo64( zFile, &FileInfo, file, sizeof(file), ext, 256, com, 1024 ) != UNZ_OK )
{
;
}
if( !( FileInfo.external_fa & FILE_ATTRIBUTE_DIRECTORY ) ) //文件,否則爲目錄
{
result=unzOpenCurrentFile(zFile);//無密碼
result=unzOpenCurrentFilePassword(zFile,"szPassword");//有密碼
}
char data[1024] = { 0 };
int size;
/**將路徑寫到list中*/
QString path = UnpressPath + QString ("/") + file;
ListPic << path;
QFile File( path );
File.open( QFile::WriteOnly );
/**打開新文件並將數據寫進去*/
while(true)
{
size= unzReadCurrentFile(zFile,data,sizeof(data));
if(size <= 0) { break; }
File.write(data, size);
}
File.close();
unzCloseCurrentFile(zFile);
if( i < gi.number_entry - 1 && unzGoToNextFile( zFile ) != UNZ_OK ) { return; }
}
unzClose(zFile);
}
else { return; }
}
實際效果請自己嘗試並解壓。