Qt unzip
最近又要在一个Qt程序中解压缩一些zip文件,以前用过QuaZIP,总觉得如果能不引入一个额外的第三方库会更舒服一些,于是上网搜了一下,还真有办法!
先在.pro
文件中添加module:
1
QT += gui-private
然后在.cpp
文件中添加头文件引用:
1
#include <private/qzipreader_p.h>
最后就是解压缩:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
QZipReader cZip("archive.zip");
foreach(QZipReader::FileInfo item, cZip.fileInfoList())
{
if (item.isDir)
{
QDir d(item.filePath);
if (!d.exists())
d.mkpath(item.filePath);
}
if (item.isFile)
{
QFile file(item.filePath);
file.open(QIODevice::WriteOnly | QIODevice::Truncate);
file.write(cZip.fileData(item.filePath));
file.close();
}
}
cZip.close();
大功告成!
用这种方法的缺点是使用了Qt的private实现,会导致二进制不兼容,比如用Qt5.9.1编译链接的程序在Qt5.9.2的环境下可能就不能正常工作了,这个问题可以通过静态链接Qt或者自带对应版本的Qt动态链接库解决。
另外有一个坑需要注意是,由于底层是使用zlib的deflate算法,所以只能解压使用这种算法进行压缩的文件,从WinZip官方网站上的说明来看,WinZip支持多种压缩算法,另一个流行的压缩软件7zip也是如此:
如果某个zip文件是通过非deflate算法,比如LZMA算法压缩的,用上面这段代码尝试解压时,就会报出诸如QZip: Unsupported compression method 14 is needed to extract the data
之类的错误消息。这个问题就算换成QuaZIP也无解,毕竟QuaZIP底层也是用的zlib。