c++调用libarchive库解压文件,

文章介绍了在使用libarchive库进行文件解压时遇到的问题,包括需要先创建对应文件夹才能解压包含相对路径的文件,以及解压带有中文字符文件的不成功。此外,作者提到尽管libarchive声称支持7z格式,但在实际操作中未成功,可能是编译问题。文中提供了一个简单的解压代码示例。

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

libarchive资料好少,倒腾好久弄出来个demo,用博客记一下

解压文件名是包含在压缩包中的相对文件路径的,要先创建在系统中对于的文件夹才能解压出来。

带中文字符的文件解压不出来,暂时没去排查原因。

libarchive库我查到的信息说是支持7z,但是实际操作下来没支持,不知道是不是编译的时候没编译好

#include <archive.h>
#include <archive_entry.h>
#include <iostream>
using namespace std;

#include <iostream>
#include <fstream>
using namespace std;

void GetFileHeader()
{
    ifstream file(R"(C:\Users\Administrator\Desktop\QtQuickApplication2\QtQuickApplication2\74.zip)");
    char buffer[11]; // 定义一个长度为11的字符数组,包括最后一个字符'\0'
    file.read(buffer, 10); // 读取文件的前10个字符
    buffer[10] = '\0'; // 字符数组最后一个字符赋值为'\0',表示字符串的结束
    cout << "前10个字符为:" << buffer << endl; // 输出所读取的字符
    file.close(); // 关闭文件
}

int example_unpress()
{
    struct archive *a;
    struct archive_entry *entry;
    int r;
    const char *password = "key"; // 

    const char *filePath = R"(C:\Users\Administrator\Desktop\QtQuickApplication2\QtQuickApplication2\74.zip)";

    a = archive_read_new();
    r = archive_read_support_format_all(a);
    archive_read_set_options(a, "7zip:use_cryptography_extension=1");
    if (r != ARCHIVE_OK) {
        exit(1);
    }

    const char *format = NULL;

    if (archive_read_add_passphrase(a, password) != ARCHIVE_OK) {
        auto i = archive_error_string(a);
        printf("Error adding passphrase: %s\n", i);
        return 1;
    }

    r = archive_read_open_filename(a, filePath, 500 * 1240); //            test.zip        
    if (r != ARCHIVE_OK) {
        auto errInfo = archive_error_string(a);
        cout << "Error opening compressed file." << endl;
        return 1;
    }

    bool is_encrypted = archive_read_has_encrypted_entries(a);

    int size = 1024 * 1024;
    char *buff = new char[size];
    while (1) {
        r = archive_read_next_header(a, &entry);
        if (r != ARCHIVE_OK) {
            auto i = archive_error_string(a);
            break;
        }

        format = archive_format_name(a);
        // 获取文件名
        const char *filename = archive_entry_pathname(entry); //;"tmp"
        if (filename == nullptr) {
            break;
        }
        cout << "Extracting: " << filename << endl;
        // 打开文件并写入解压数据
        FILE *file = fopen(filename, "wb");
        if (!file) {
            cout << "Error opening file." << endl;
            return 1;
        }
        while (1) {
            r = archive_read_data(a, buff, size);
            if (r <= 0) {
                auto i = archive_error_string(a);
                break;
            }
            fwrite(buff, size, 1, file);
        }
        fclose(file);
    }
    delete[]buff;


    archive_read_close(a);
    archive_read_free(a);

    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值