温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++解压与文件压缩格式支持

发布时间:2024-10-30 16:34:49 来源:亿速云 阅读:85 作者:小樊 栏目:编程语言

在C++中,可以使用标准库中的<zip.h>头文件来处理ZIP文件格式的压缩和解压

#include <iostream>
#include <fstream>
#include <vector>
#include <zip.h>

bool zipFile(const std::string& inputFile, const std::string& outputFile) {
    // 打开输入文件
    std::ifstream inFile(inputFile, std::ios::binary);
    if (!inFile) {
        std::cerr << "Error opening input file: " << inputFile << std::endl;
        return false;
    }

    // 创建一个ZIP归档对象
    zip_t archive = zip_open(outputFile.c_str(), ZIP_CREATE | ZIP_EXCL, nullptr);
    if (!archive) {
        std::cerr << "Error creating output file: " << outputFile << std::endl;
        return false;
    }

    // 读取输入文件并将其添加到ZIP归档中
    zip_source_t source = zip_source_file(archive, inputFile.c_str(), 0, 0);
    if (!source) {
        std::cerr << "Error adding file to archive: " << inputFile << std::endl;
        zip_close(archive);
        return false;
    }

    int result = zip_file_add(archive, "input.txt", source, ZIP_FL_ENC_GUESS);
    if (result < 0) {
        std::cerr << "Error adding file to archive: " << inputFile << std::endl;
        zip_source_free(source);
        zip_close(archive);
        return false;
    }

    // 释放ZIP归档资源
    zip_source_free(source);
    zip_close(archive);

    return true;
}

bool unzipFile(const std::string& inputFile, const std::string& outputFile) {
    // 打开输入文件
    std::ifstream inFile(inputFile, std::ios::binary);
    if (!inFile) {
        std::cerr << "Error opening input file: " << inputFile << std::endl;
        return false;
    }

    // 创建一个ZIP归档对象
    zip_t archive = zip_open(inputFile.c_str(), ZIP_READ, nullptr);
    if (!archive) {
        std::cerr << "Error opening archive: " << inputFile << std::endl;
        return false;
    }

    // 获取归档中的文件数量
    int numFiles = zip_get_num_entries(archive, 0);
    if (numFiles < 0) {
        std::cerr << "Error getting number of files in archive: " << inputFile << std::endl;
        zip_close(archive);
        return false;
    }

    // 遍历归档中的每个文件
    for (int i = 0; i < numFiles; ++i) {
        zip_file_t file = zip_fopen_index(archive, i, 0);
        if (!file) {
            std::cerr << "Error opening file in archive: " << inputFile << std::endl;
            zip_close(archive);
            return false;
        }

        // 获取文件名
        char filename[256];
        zip_get_name(file, filename, sizeof(filename));

        // 创建输出文件
        std::ofstream outFile(outputFile + "/" + filename, std::ios::binary);
        if (!outFile) {
            std::cerr << "Error creating output file: " << outputFile + "/" + filename << std::endl;
            zip_fclose(file);
            zip_close(archive);
            return false;
        }

        // 将文件内容复制到输出文件
        char buffer[4096];
        size_t bytesRead;
        while ((bytesRead = zip_fread(file, buffer, sizeof(buffer))) > 0) {
            outFile.write(buffer, bytesRead);
        }

        // 关闭文件
        zip_fclose(file);
    }

    // 释放ZIP归档资源
    zip_close(archive);

    return true;
}

int main() {
    std::string inputFile = "input.zip";
    std::string outputFile = "output";

    if (zipFile(inputFile, outputFile)) {
        std::cout << "Successfully zipped file: " << inputFile << std::endl;
    } else {
        std::cerr << "Error zipping file: " << inputFile << std::endl;
    }

    if (unzipFile(inputFile, outputFile)) {
        std::cout << "Successfully unzipped file: " << inputFile << std::endl;
    } else {
        std::cerr << "Error unzipping file: " << inputFile << std::endl;
    }

    return 0;
}

这个示例中,zipFile函数用于将一个文件压缩到ZIP归档中,而unzipFile函数用于从ZIP归档中解压缩文件。请注意,这个示例仅支持ZIP文件格式,如果需要支持其他压缩格式,可以考虑使用第三方库,如minizipzlib

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

c++
AI