在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文件格式,如果需要支持其他压缩格式,可以考虑使用第三方库,如minizip或zlib。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。