您好,登錄后才能下訂單哦!
在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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。