挖井

类库大魔王的挖井日记

挖一口属于自己的井


Qt unzip

最近又要在一个Qt程序中解压缩一些zip文件,以前用过QuaZIP,总觉得如果能不引入一个额外的第三方库会更舒服一些,于是上网搜了一下,还真有办法!

先在.pro文件中添加module:

QT += gui-private

然后在.cpp文件中添加头文件引用:

#include <private/qzipreader_p.h>

最后就是解压缩:

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

本文地址:

https://minidump.info/blog/2018/02/qt-unzip/

上一篇

HAProxy for SS(R)

昨天在喵帕斯tg群里看到一张HAProxy的截图,经过了解,原来是梅林固件自带的,真是不错的想法。想当初,我为了实现$$的load balance,不惜花费大量的时间和精力,自己用Go写了个客户端,结果后来喵帕斯全面开启多用户单端口,而我的程序在带参数的混淆和协议上实现有问题,于是换回用lib...…

gfw 全文阅读
下一篇

UMLGen开发踩坑

最近这段时间都在写一个叫UMLGen的GUI程序,从名字可以看出,就是一个用来画UML图的工具,与大多数现有的WYSIWYG(所见即所得)的UML画图工具(比如Visio,StarUML等等)不同的是,UMLGen使用代码的形式来描述UML图的呈现,与LaTeX的思想类似,即WYTIWYG(W...…

Shareware 全文阅读