C++如何解压文件

问题描述 投票:0回答:1

我找到了解压文件的代码:

#include <zlib.h>

#define CHUNK_SIZE 16384 // 16 KB

bool unzipFile(const char* zipFileName, const char* extractFileName) {
    // Open the input file (compressed)
    std::ifstream inFile(zipFileName, std::ios::binary);
    if (!inFile.is_open()) {
        std::cerr << "Error: Unable to open input file." << std::endl;
        return false;
    }

    // Open the output file (uncompressed)
    std::ofstream outFile(extractFileName, std::ios::binary);
    if (!outFile.is_open()) {
        std::cerr << "Error: Unable to create output file." << std::endl;
        inFile.close();
        return false;
    }

    // Initialize zlib structures
    z_stream stream;
    stream.zalloc = Z_NULL;
    stream.zfree = Z_NULL;
    stream.opaque = Z_NULL;
    stream.avail_in = 0;
    stream.next_in = Z_NULL;
    if (inflateInit(&stream) != Z_OK) {
        std::cerr << "Error: Failed to initialize zlib." << std::endl;
        inFile.close();
        outFile.close();
        return false;
    }

    // Uncompress data
    unsigned char inBuffer[CHUNK_SIZE];
    unsigned char outBuffer[CHUNK_SIZE];
    int ret;
    do {
        inFile.read(reinterpret_cast<char*>(inBuffer), CHUNK_SIZE);
        stream.avail_in = inFile.gcount();
        stream.next_in = inBuffer;
        do {
            stream.avail_out = CHUNK_SIZE;
            stream.next_out = outBuffer;
            ret = inflate(&stream, Z_NO_FLUSH);
            switch (ret) {
                case Z_NEED_DICT:
                case Z_DATA_ERROR:
                case Z_MEM_ERROR:
                    inflateEnd(&stream);
                    inFile.close();
                    outFile.close();
                    return false;
            }
            outFile.write(reinterpret_cast<char*>(outBuffer), CHUNK_SIZE - stream.avail_out);
        } while (stream.avail_out == 0);
    } while (ret != Z_STREAM_END);

    // Clean up
    inflateEnd(&stream);
    inFile.close();
    outFile.close();

    return true;
}

int main()
{
   const char* zipFileName = "zip_filename.zip";
   const char* extractFileName = "extracted_file.csv";
   if (unzipFile(zipFileName, extractFileName)) {
        std::cout << "File unzipped successfully." << std::endl;
    } else {
        std::cerr << "Failed to unzip file." << std::endl;
    }
}

但是尝试时返回 false。我收到“无法解压缩文件”。 所以它出现在 // Uncompress data 部分之后,因为我在该块之前没有收到任何其他错误。

我不确定这里出了什么问题,这是一个经典的 zip 文件,其中包含 csv 文件。我一直被困住,不知道出了什么问题。有人知道错误吗?

c++ zip zlib
1个回答
0
投票

该代码将解压缩 zlib 流,而不是 zip 文件。 两种不同的东西。无论您在哪里找到该代码,该函数的命名都非常糟糕。它并不像它的名字所声称的那样:

unzipFile

您可以查看像 libarchive 这样的库来解压缩文件,或者您可以使用 zip 文件格式规范编写自己的库,由 zlib 支持,用于 deflate 格式的原始解压缩和 CRC 计算。

© www.soinside.com 2019 - 2024. All rights reserved.