类库大魔王
类库大魔王 懒惰,傲慢,以及无耐心

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动态链接库解决。

另外有一个坑需要注意是,由于底层是使用zlibdeflate算法,所以只能解压使用这种算法进行压缩的文件,从WinZip官方网站上的说明来看,WinZip支持多种压缩算法,另一个流行的压缩软件7zip也是如此:

7zip compress methods

如果某个zip文件是通过非deflate算法,比如LZMA算法压缩的,用上面这段代码尝试解压时,就会报出诸如QZip: Unsupported compression method 14 is needed to extract the data之类的错误消息。这个问题就算换成QuaZIP也无解,毕竟QuaZIP底层也是用的zlib

感觉本文不错,不妨小额鼓励我一下!
支付宝扫一扫

支付宝扫一扫

微信扫一扫

微信扫一扫

如果你看不到评论框,说明Disqus被墙了。