0
点赞
收藏
分享

微信扫一扫

Qt下使用7Z源码进行压缩和解压缩

舍予兄 2024-05-03 阅读 9

7Z压缩是一款常用的压缩算法和工具,本文主要介绍一款在qt环境下进行编译的压缩方法。

本人测试是可以正常跑通的,具体代码部分请下载:下载链接,提取码:ev9t

7z源码网址:7-Zip

7z简介:

7z 是一种全新的压缩格式,它拥有极高的压缩比。

7z 格式的主要特征:

  • 开放的结构
  • 高压缩比
  • 强大的 AES-256 加密
  • 能够兼容任意压缩、转换、加密算法
  • 最高支持 16000000000 GB 的文件压缩
  • 以 Unicode 为标准的文件名
  • 支持固实压缩
  • 支持文件头压缩

7z 已公开了结构编辑功能,所以它可以支持任何一种新的压缩算法。到目前为止,下列压缩算法已被整合到了 7z 中:

本文分享的代码具备直接调用7z源码进行操作,具有较高的学习价值。

//列出文件
void MainWindow::on_pushButton_2_clicked()
{

    Q7z::initSevenZ();
    const QString path = "E:/ProjectTest/QT/LZMA/lz.7z";
    QFile file(path);
    file.open(QIODevice::ReadOnly);
    QVector<Q7z::File> files = Q7z::listArchive(&file);

    for(int i =0;i<files.count();i++){
        Q7z::File file = files.at(i);
        qDebug()<<file.path;
    }
}

QVector<File> listArchive(QFileDevice *archive)
{
    Q7Z_ASSERTS(archive, Readable)

    const qint64 initialPos = archive->pos();
    try {
        CCodecs codecs;
        if (codecs.Load() != S_OK)
            throw SevenZipException(QCoreApplication::translate("Q7z", "Cannot load codecs."));

        COpenOptions op;
        op.codecs = &codecs;

        CObjectVector<COpenType> types;
        op.types = &types;  // Empty, because we use a stream.

        CIntVector excluded;
        op.excludedFormats = &excluded;

        const CMyComPtr<IInStream> stream = new QIODeviceInStream(archive);
        op.stream = stream; // CMyComPtr is needed, otherwise it crashes in OpenStream().

        CObjectVector<CProperty> properties;
        op.props = &properties;

        CArchiveLink archiveLink;
        if (archiveLink.Open2(op, nullptr) != S_OK) {
            throw SevenZipException(QCoreApplication::translate("Q7z",
                "Cannot open archive \"%1\".").arg(archive->fileName()));
        }

        QVector<File> flat;
        for (unsigned i = 0; i < archiveLink.Arcs.Size(); ++i) {
            IInArchive *const arch = archiveLink.Arcs[i].Archive;
            UInt32 numItems = 0;
            if (arch->GetNumberOfItems(&numItems) != S_OK) {
                throw SevenZipException(QCoreApplication::translate("Q7z",
                    "Cannot retrieve number of items in archive."));
            }
            flat.reserve(flat.size() + numItems);
            for (uint item = 0; item < numItems; ++item) {
                UString s;
                if (archiveLink.Arcs[i].GetItemPath(item, s) != S_OK) {
                    throw SevenZipException(QCoreApplication::translate("Q7z",
                        "Cannot retrieve path of archive item \"%1\".").arg(item));
                }
                File f;
                f.archiveIndex.setX(i);
                f.archiveIndex.setY(item);
                f.path = UString2QString(s).replace(QLatin1Char('\\'), QLatin1Char('/'));
                Archive_IsItem_Folder(arch, item, f.isDirectory);
                f.permissions = getPermissions(arch, item, nullptr);
                getDateTimeProperty(arch, item, kpidMTime, &(f.utcTime));
                f.uncompressedSize = getUInt64Property(arch, item, kpidSize, 0);
                f.compressedSize = getUInt64Property(arch, item, kpidPackSize, 0);
                flat.append(f);
            }
        }
        return flat;
    } catch (const char *err) {
        archive->seek(initialPos);
        throw SevenZipException(err);
    } catch (const SevenZipException &e) {
        archive->seek(initialPos);
        throw e; // re-throw unmodified
    } catch (...) {
        archive->seek(initialPos);
        throw SevenZipException(QCoreApplication::translate("Q7z",
            "Unknown exception caught (%1).").arg(QString::fromLatin1(Q_FUNC_INFO)));
    }
    return QVector<File>(); // never reached
}

链接: https://pan.baidu.com/s/15VldB4LMVgl3XbOabGZ-og 提取码: ev9t

请按需提取

举报

相关推荐

0 条评论