Qt 编译使用Bit7z库接口调用7z.dll、7-Zip.dll解压压缩常用Zip、ISO9660、Wim、Esd、7z等格式文件(一)

本文介绍了如何使用Qt编译和集成bit7z库,以便解压和压缩包括ISO9660、WIM、7z等在内的多种文件格式。内容涵盖bit7z库的编译过程,需要的7z.dll和相关dll文件的获取,以及在Qt项目中调用库的注意事项和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

bit7z一个c++静态库,为7-zip共享库提供了一个干净简单的接口
使用CMAKE重新编译github上的bit7z库,用来解压/预览iso9660WImZip,Rar等常用的压缩文件格式。z-zip库支持大多数压缩文件格式

编译bit7z(C++版本)

bit7z是一个跨平台的c++静态库,它允许通过一个干净简单的包装器接口从7-zip项目压缩/提取归档文件到动态库。
它支持对文件系统或内存进行压缩和提取、读取存档元数据、更新现有的存档元数据、创建多卷存档、操作进度回调以及许多其他功能。
压缩支持格式:7z, XZ, BZIP2, GZIP, TAR, ZIP, and WIM.
解压支持格式:7z, AR, ARJ, BZIP2, CAB, CHM, CPIO, CramFS, DEB, DMG, EXT, FAT, GPT, GZIP, HFS, HXS, IHEX, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, QCOW2, RAR, RAR5, RPM, SquashFS, TAR, UDF, UEFI, VDI, VHD, VMDK, WIM, XAR, XZ, Z, and ZIP
更多详细:https://github.com/rikyoz/bit7z
不建议使用此版本调用7-zip库;

使用mscv 2017编译器编译

https://github.com/rikyoz/bit7z下载源码后解压使用cMake默认mscv2017直接可以编译,选项直接默认或者全选就行,然后再点击 Configure-》generate;
在这里插入图片描述
编译后生成以下目录
在这里插入图片描述
此时需要返回bit7z-master原目录添加lamz1900
在这里插入图片描述
下载lamz1900包:https://www.7-zip.org/a/lzma1900.7z
解压lzma1900,将lzma1900中的文件复制到bit7z-master包下的third_party/7-zip文件夹中
在这里插入图片描述
打开编译好的bit7z.sln文件修改设置bit7z为启动项,修改属性页-》c/C++附件目录中的库文件目录,然后右键重新生成,在生成目录下找到生成好的bit7z.lib文件
在这里插入图片描述
通过这种方法生成lib库,BitCompressor 类变成了一个模版类,调用方式参考github的后半段说明,比较繁琐,源码中展示的案例也貌似是付费内容,需要三方库。
建议直接通过编译下载Qt版本bit7z库调用

参考借鉴文章

C++ 7z解压缩编译及使用
c++配置并使用bit7z加密压缩或解压7z文件
bit7z库 :https://github.com/rikyoz/bit7z

下载bit7z(QT版本)

直接下载Qt版本的bit7z库,能直接重新选择编译器生成Bit7z
主要是参考这篇文章:
qt5 7zip源码编译及使用(含展示进度)
解压后直接可以打开bit7z.pro ,
在这里插入图片描述
同时也需要把lzma1900中的文件放到7zsdk文件夹中,再选择编译器编译就行。
在这里插入图片描述

调用bit7z库

以Qt版本源码生成的bit7z库为例,需要在项目pro文件中添加lib引用和include文件夹引用

///生成的lib库地址
win32:CONFIG(release, debug|release): LIBS += -L$$DESTDIR/ -lbit7z
else:win32:CONFIG(debug, debug|release): LIBS += -L$$DESTDIR/ -lbit7zd

#include文件目录所在 包括所有hpp头文件
INCLUDEPATH += $$PWD/../bit7z
DEPENDPATH += $$PWD/../bit7z

注意调用时需要OleAut32.lib和User32.lib这两个文件,

# 不加上-lOleAut32 -lUser32这段 bit7z无法解析 
LIBS += -L$$DESTDIR -lbit7z -lOleAut32 -lUser32

编译时最好在bitformat.hpp文件中添加此宏定义,

//使用此宏定义调用时只需要使用 BitFormat::Auto
//不用再判断文件类型
#define BIT7Z_AUTO_FORMAT

在这里插入图片描述

和bit7z.lib文件放在同一目录下。
参考:
qt5 7zip源码编译及使用(含展示进度)
https://gitcode.net/mirrors/rikyoz/Bit7z/-/tree/hotfix/v3.1.4

至于需要的7-zip库:
7z.dll可以通过官网:7-Zip -程序下载安装后获取。
在这里插入图片描述
7za.dll和7zxa.dll可以直接下载:https://www.7-zip.org/a/7z1900-extra.7z解压获取
建议7za.dll和7zxa.dll和7z.dll和执行程序放同一目录下
其中:
7z.dll应该支持所有功能,而7za.dll应该只支持7z文件格式,而7zxa.dll只能提取7z文件
在这里插入图片描述

the 7z.dll should support all these features, while 7za.dll should support only the 7z file format and the 7zxa.dll can only extract 7z files. For more information about the 7-zip DLLs, please see this wiki page

编译出现异常可以参考[笔记] 编译bit7z踩坑记录

调用库(hotfix/v3.1.4/示例)

解压文件

#include "bitextractor.hpp"

using namespace  bit7z;

try {
    Bit7zLibrary lib{ L"7za.dll" };
    //启用宏定义BIT7Z_AUTO_FORMAT后可以直接使用BitFormat::Auto
    BitExtractor extractor{ lib, BitFormat::SevenZip };

    extractor.extract( L"path/to/archive.7z", L"out/dir/" ); //extracting a simple archive

    extractor.extractMatching( L"path/to/arc.7z", L"file.pdf", L"out/dir/" ); //extracting a specific file

    //extracting the first file of an archive to a buffer
    std::vector< byte_t > buffer;
    extractor.extract( L"path/to/archive.7z", buffer );

    //extracting an encrypted archive
    extractor.setPassword( L"password" );
    extractor.extract( L"path/to/another/archive.7z", L"out/dir/" );
} catch ( const BitException& ex ) {
    //do something with ex.what()...
}

压缩文件

#include "bitcompressor.hpp"

using namespace bit7z;

try {
    Bit7zLibrary lib{ L"7z.dll" };
    //启用宏定义BIT7Z_AUTO_FORMAT后可以直接使用BitFormat::Auto
    BitCompressor compressor{ lib, BitFormat::Zip };

    std::vector< std::wstring > files = { L"path/to/file1.jpg", L"path/to/file2.pdf" };

    compressor.compress( files, L"output_archive.zip" ); //creating a simple zip archive

    //creating a zip archive with a custom directory structure
    std::map< std::wstring, std::wstring > files_map = { { L"path/to/file1.jpg", L"alias/path/file1.jpg" },
    { L"path/to/file2.pdf", L"alias/path/file2.pdf" } };
    compressor.compress( files_map, L"output_archive2.zip" );

    compressor.compressDirectory( L"dir/path/", L"dir_archive.zip" ); //compressing a directory

    //creating an encrypted zip archive of two files
    compressor.setPassword( L"password" );
    compressor.compressFiles( files, L"protected_archive.zip" );

    //updating an existing zip archive
    compressor.setUpdateMode( true );
    compressor.compressFiles( files, L"existing_archive.zip" );

    //compressing a single file into a buffer
    std::vector< byte_t > buffer;
    BitCompressor compressor2{ lib, BitFormat::BZip2 };
    compressor2.compressFile( files[0], buffer );
} catch ( const BitException& ex ) {
    //do something with ex.what()...
}

查看文件详细

可以通过此方法直接预览压缩文件夹内容

#include "bitarchiveinfo.hpp"

using namespace bit7z;

try {
    Bit7zLibrary lib{ L"7za.dll" };
    BitArchiveInfo arc{ lib, L"archive.7z", BitFormat::SevenZip };

    //printing archive metadata
    wcout << L"Archive properties" << endl;
    wcout << L" Items count: "   << arc.itemsCount() << endl;
    wcout << L" Folders count: " << arc.foldersCount() << endl;
    wcout << L" Files count: "   << arc.filesCount() << endl;
    wcout << L" Size: "          << arc.size() << endl;
    wcout << L" Packed size: "   << arc.packSize() << endl;
    wcout << endl;

    //printing archive items metadata
    wcout << L"Archive items";
    auto arc_items = arc.items();
    for ( auto& item : arc_items ) {
        wcout << endl;
        wcout << L" Item index: "   << item.index() << endl;
        wcout << L"  Name: "        << item.name() << endl;
        wcout << L"  Extension: "   << item.extension() << endl;
        wcout << L"  Path: "        << item.path() << endl;
        wcout << L"  IsDir: "       << item.isDir() << endl;
        wcout << L"  Size: "        << item.size() << endl;
        wcout << L"  Packed size: " << item.packSize() << endl;
    }
} catch ( const BitException& ex ) {
    //do something with ex.what()...
}

调用库可执行程序示例

Qt调用Bit7z库接口调用7z.dll解压压缩常用Zip、ISO9660、Wim、7z等格式的可执行程序,非源码!Qt案例
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

获取源码

bit7z这个库的使用有很多教程,花点时间就能搞懂,如果你想省下这段时间那么建议:
付费下载源码 :Qt 编译使用Bit7z库接口调用7z.dll、7-Zip.dll解压压缩常用Zip、ISO9660、Wim、Esd、7z等示例源码
有什么问题可以直接私信或者加Q联系。
源码版本:Qt Creator 5.13 | MSCV2017

源码编译事项

因为这bit7z库参考原作者(具体谁忘了)的编译方式,是编译到项目目录下的Build目录中,
在其他项目中注释掉bit7z.pro中的以下部分就是编译到默认编译路径下,


# 如果需要正常生成到 build-XXX-Desktop_Qt_5_13_1_MSVC2017_64bit-Release 这种格式路径
# 就注释掉下面部分的内容
# 这是修改了跳转的内容

TARGET =  bit7z$${BUILD_SUFFIX}
#$$PWD/../Build/$${PLATFORM}/bit7z$${ARCH_SUFFIX}$${BUILD_SUFFIX}
DESTDIR  = $$PWD/../Build/$${PLATFORM}/
#message($$DESTDIR)
OBJECTS_DIR = $$PWD/build/$${PLATFORM}/$${BUILD}/.obj
RCC_DIR  = $$PWD/build/$${PLATFORM}/$${BUILD}/.rcc

编译时先编译bit7z再编译Bit7Z_TUI
在这里插入图片描述

正常添加到项目的引用方式:

# 正常添加到项目的引用方式,在这里做个示范
# win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../bit7z/release/ -lbit7z
# else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../bit7z/debug/ -lbit7z
# else:unix: LIBS += -L$$OUT_PWD/../bit7z/ -lbit7z
# INCLUDEPATH += $$PWD/../bit7z
# DEPENDPATH += $$PWD/../bit7z
# win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../bit7z/release/libbit7z.a
# else:win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../bit7z/debug/libbit7z.a
# else:win32:!win32-g++:CONFIG(release, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../bit7z/release/bit7z.lib
# else:win32:!win32-g++:CONFIG(debug, debug|release): PRE_TARGETDEPS += $$OUT_PWD/../bit7z/debug/bit7z.lib
# else:unix: PRE_TARGETDEPS += $$OUT_PWD/../bit7z/libbit7z.a
# # 不加上-lOleAut32 -lUser32这段 bit7z无法解析
# win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../bit7z/release/ -lOleAut32 -lUser32
# else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../bit7z/debug/ -lOleAut32 -lUser32

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

得鹿梦鱼、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值