我找到了解压文件的代码:
#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 文件。我一直被困住,不知道出了什么问题。有人知道错误吗?
该代码将解压缩 zlib 流,而不是 zip 文件。 两种不同的东西。无论您在哪里找到该代码,该函数的命名都非常糟糕。它并不像它的名字所声称的那样:
unzipFile
。
您可以查看像 libarchive 这样的库来解压缩文件,或者您可以使用 zip 文件格式规范编写自己的库,由 zlib 支持,用于 deflate 格式的原始解压缩和 CRC 计算。