littlebot
Published on 2025-04-09 / 0 Visits
0

【源码】基于C++的压缩解压缩工具库

项目简介

本项目是一个跨平台的C++静态库,为7 - zip动态库提供了简洁的封装接口。利用该库,开发者能够在文件系统和内存间进行压缩与解压缩操作,还可读取存档元数据、更新现有存档、创建多卷存档以及设置操作进度回调等。

项目的主要特性和功能

特性

  • 跨平台支持:支持Windows、Linux、macOS和Android系统。
  • 多架构支持:涵盖x86、x86_64、arm、arm64架构。
  • 多编译器支持:可使用MSVC 2015及以上、MinGW v6.4及以上、GCC v4.9及以上、Clang 3.6及以上编译器。

功能

  • 压缩功能:支持7z、XZ、BZIP2、GZIP、TAR、ZIP和WIM等多种格式。
  • 解压缩功能:能处理7z、AR、ARJ、BZIP2等众多存档格式。
  • 其他功能:可读取存档及其内容的元数据、测试存档错误、更新现有存档、重命名或删除存档内旧项、在内存和标准流中进行压缩与解压缩、使用自定义路径别名压缩、选择性提取文件、创建加密存档、选择压缩级别和方法等。

安装使用步骤

安装

假设用户已下载本项目的源码文件,可按以下步骤构建库: bash cd <bit7z folder> mkdir build && cd build cmake ../ -DCMAKE_BUILD_TYPE=Release cmake --build . -j --config Release 也可通过CMake将库直接集成到项目中: 1. 下载bit7z并复制到项目子目录(如third_party),或作为git子模块添加到仓库。 2. 在CMakeLists.txt中使用add_subdirectory()命令包含bit7z。 3. 使用target_link_libraries()命令链接bit7z库。

示例: cmake add_subdirectory( ${CMAKE_SOURCE_DIR}/third_party/bit7z ) target_link_libraries( ${YOUR_TARGET} PRIVATE bit7z )

使用

从存档中提取文件

```cpp

include

try { using namespace bit7z;

Bit7zLibrary lib{ "7za.dll" };
BitFileExtractor extractor{ lib, BitFormat::SevenZip };

extractor.extract( "path/to/archive.7z", "out/dir/" );
extractor.extractMatching( "path/to/archive.7z", "file.pdf", "out/dir/" );

std::vector< byte_t > buffer;
extractor.extract( "path/to/archive.7z", buffer );

extractor.setPassword( "password" );
extractor.extract( "path/to/another/archive.7z", "out/dir/" );

} catch ( const bit7z::BitException& ex ) { / 处理异常 / } ```

将文件压缩到存档

```cpp

include

try { using namespace bit7z;

Bit7zLibrary lib{ "7z.dll" };
BitFileCompressor compressor{ lib, BitFormat::Zip };

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

compressor.compress( files, "output_archive.zip" );

std::map< std::string, std::string > files_map = {
    { "path/to/file1.jpg", "alias/path/file1.jpg" },
    { "path/to/file2.pdf", "alias/path/file2.pdf" }
};
compressor.compress( files_map, "output_archive2.zip" );

compressor.compressDirectory( "dir/path/", "dir_archive.zip" );

compressor.setPassword( "password" );
compressor.compressFiles( files, "protected_archive.zip" );

compressor.setUpdateMode( UpdateMode::Append );
compressor.compressFiles( files, "existing_archive.zip" );

std::vector< bit7z::byte_t > buffer;
BitFileCompressor compressor2{ lib, BitFormat::BZip2 };
compressor2.compressFile( files[0], buffer );

} catch ( const bit7z::BitException& ex ) { / 处理异常 / } ```

读取存档元数据

```cpp

include

try { using namespace bit7z;

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

std::cout << "Archive properties\n";
std::cout << "  Items count: "   << arc.itemsCount() << '\n';
std::cout << "  Folders count: " << arc.foldersCount() << '\n';
std::cout << "  Files count: "   << arc.filesCount() << '\n';
std::cout << "  Size: "          << arc.size() <<'\n';
std::cout << "  Packed size: "   << arc.packSize() << "\n\n";

std::cout << "Archived items";
for ( const auto& item : arc ) {
    std::cout << '\n';
    std::cout << "  Item index: "    << item.index() << '\n';
    std::cout << "    Name: "        << item.name() << '\n';
    std::cout << "    Extension: "   << item.extension() << '\n';
    std::cout << "    Path: "        << item.path() << '\n';
    std::cout << "    IsDir: "       << item.isDir() << '\n';
    std::cout << "    Size: "        << item.size() << '\n';
    std::cout << "    Packed size: " << item.packSize() << '\n';
    std::cout << "    CRC: " << std::hex << item.crc() << std::dec << '\n';
}
std::cout.flush();

} catch ( const bit7z::BitException& ex ) { / 处理异常 / } ```

下载地址

点击下载 【提取码: 4003】【解压密码: www.makuang.net】