Qt調用zlib庫文件解壓縮zip文件

前段時間一直在搞Qt解壓縮zip文件,在網上找了很多的方法,差不多都是一模一樣的代碼,都是簡潔扼要的東西,到最後啥都沒看懂,白白浪費了很多時間。網上很多的使用quazip開源源碼庫解壓和壓縮,但是quazip要自己編譯,而編譯又對軟件有要求,quazip支持的平臺有限,所以不能通用,下載的別人編譯好的 lib庫文件,又會因爲Qt版本的限制而不能用。
經過自己多天的研究,終於找到了Qt調用zlib解壓縮的方法,現將一些過程分享出來,一起學習。這裏只有解壓的源碼,壓縮和解壓差不多

  1. 先下載zlib的dll文件
    http://download.csdn.net/detail/tax10240809163com/9469712
  2. 再下載zlib的zip文件,因爲要用到它的源碼
    http://download.csdn.net/detail/tax10240809163com/9469715
    /*上面的這兩個文件也可以直接在zlib官網下載/
    http://www.zlib.net/
  3. 將dll解壓出來的dll.lib文件鏈接到你的工程中,具體用什麼工具就有什麼鏈接
  4. 把zlib128.zip裏面contrib\minizip目錄下的.c和.h源文件(除了minzip.c和minunz.c兩個文件外)拷貝出來放到Qt工程目錄下, Qt工程目錄添加這些.c文件進來。
  5. 接下來就是源碼了,這裏只有解壓的代碼:

/**
*返回值:將解壓出來的文件的絕對路徑保存在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; }
}

實際效果請自己嘗試並解壓。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章