前段时间一直在搞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; }
}
实际效果请自己尝试并解压。