• 14322阅读
  • 12回复

[提问]Qt 如何解压zip包 [复制链接]

上一主题 下一主题
离线xiexiaoping
 

只看楼主 倒序阅读 楼主  发表于: 2011-03-04
如题
离线XChinux

只看该作者 1楼 发表于: 2011-03-04
下载个7za.exe,用QProcess::execute()来解压
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线tlcugb

只看该作者 2楼 发表于: 2013-09-21
我怎么用
离线tlcugb

只看该作者 3楼 发表于: 2013-09-21
QProcess zip;
    QStringList arguments;
    arguments<<QString("x %1 -o%2").arg(file).arg(tempPath);
    zip.start("7za.exe", arguments);
离线tlcugb

只看该作者 4楼 发表于: 2013-09-21
这种方式启动不了啊?谢谢
离线呆呆很呆
只看该作者 5楼 发表于: 2013-09-21
回 4楼(tlcugb) 的帖子
其实qt有解压zip的类 只不过是私有类 所以qt文档没有 但源码中有

当然私有类有私有类的坏处(比如可以随时取消) 不过我感觉效率要高 用哪个自己决定吧
离线渡世白玉

只看该作者 6楼 发表于: 2013-09-21
调用第三方zip库、、
离线realfan

只看该作者 7楼 发表于: 2013-09-21
网上应该有zip压缩解压的源码。直接用在工程中就行了。
离线呆呆很呆
只看该作者 8楼 发表于: 2013-09-22
关于Qt内置的解压zip类QZipReader 写了一个实例 打架可以参考一下
  1. #include <QtGui/5.0.1/QtGui/private/qzipreader_p.h>
  2. #include <QtCore>
  3. int main(int argc,char *argv[])
  4. {
  5.         QZipReader zip("test.zip");//当前目录下的test.zip
  6.         QList<QZipReader::FileInfo> l= zip.fileInfoList();//获取zip中所有文件信息
  7.         foreach(QZipReader::FileInfo f,l){//遍历
  8.                 qDebug()<<"Filename:"<<f.filePath;//获取文件名并输出
  9.                 qDebug()<<"Filedata:"<<zip.fileData(f.filePath);//获取文件内容 (返回QByteArray txt文件可以直接输出 其他文件输出肯定是乱码不解释)
  10.         }
  11.         //qDebug()<<zip.extractAll("./test"); //这功能不好用的 建议别用 又不是做压缩软件 前面信息够你用的
  12.         return 0;
  13. }
  14. /*附录:
  15. 1.QZipReader::FileInfo的声明
  16.     struct Q_GUI_EXPORT FileInfo
  17.     {
  18.         FileInfo();
  19.         FileInfo(const FileInfo &other);
  20.         ~FileInfo();
  21.         FileInfo &operator=(const FileInfo &other);
  22.         //不解释
  23.         bool isValid() const;//貌似是有没有效?
  24.         QString filePath;//路径
  25.         uint isDir : 1;//是否为目录 这个不好用 就是因为他不好用使得extractAll不好用
  26.         uint isFile : 1;//是否为文件
  27.         uint isSymLink : 1;//快捷方式
  28.         QFile::Permissions permissions;//看QFile::Permissions的文档就好了
  29.         uint crc;//不知道
  30.         qint64 size;//大小
  31.         QDateTime lastModified;//最后修改日期
  32.         void *d;//不知道
  33.     };
  34. 2.几个有用的函数
  35.     QList<FileInfo> fileInfoList() const; 获取所有文件信息
  36.     FileInfo entryInfoAt(int index) const; 获取第index个文件的信息
  37.     int count() const; 文件数
  38.     QByteArray fileData(const QString &fileName) const;获取文件内容
  39.     Status status() const;获取状态 用于判断错误 翻源码不解释
  40.     void close(); 关闭?
  41.     QIODevice* device() const; 很常见 获取zip文件的QIODevice
  42.     bool isReadable() const; 是否可读
  43.     bool exists() const;是否存在
  44.     explicit QZipReader(const QString &fileName, QIODevice::OpenMode mode = QIODevice::ReadOnly ); 构造函数1
  45.     explicit QZipReader(QIODevice *device);构造函数2
  46.     ~QZipReader(); 这个还用解释吗?
  47. */

离线呆呆很呆
只看该作者 9楼 发表于: 2013-09-22
对应的还有QZipWriter 说这个就跑题了 楼主问的是怎样解压.......

源码位置
qt5/qtbase/src/gui/text/qzipwriter.h
qt5/qtbase/src/gui/text/qzipreader.h
qt5/qtbase/src/gui/text/qzip.cpp

include位置
qt5/qtbase/include/QtGui/5.0.1/QtGui/private/qzipreader_p.h
qt5/qtbase/include/QtGui/5.0.1/QtGui/private/qzipwriter_p.h
离线ashe0817

只看该作者 10楼 发表于: 2013-09-29
最简单的办法如1楼所说,调用7z的命令行版本7za.exe
离线XChinux

只看该作者 11楼 发表于: 2013-10-02
用7za就很不错的,以解决问题为首要
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线xiao5491

只看该作者 12楼 发表于: 2013-10-12
为啥不试试zlib呢
快速回复
限100 字节
 
上一个 下一个