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; }
}

实际效果请自己尝试并解压。

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