在Linux系統中,可以使用多種工具和庫來實現文件的壓縮和解壓。以下是一些常用的方法和示例:
gzip 和 gunzip
壓縮文件:
gzip filename
這將生成一個名為 filename.gz
的壓縮文件,并刪除原始文件。
解壓文件:
gunzip filename.gz
這將解壓 filename.gz
并恢復原始文件。
tar
創建 tar 歸檔(不壓縮):
tar -cvf archive.tar /path/to/directory_or_file
創建 gzip 壓縮的 tar 歸檔:
tar -czvf archive.tar.gz /path/to/directory_or_file
解壓 tar 歸檔:
tar -xvf archive.tar
解壓 gzip 壓縮的 tar 歸檔:
tar -xzvf archive.tar.gz
zip 和 unzip
壓縮文件或目錄:
zip -r archive.zip /path/to/directory_or_file
解壓 zip 文件:
unzip archive.zip
如果你想在 C++ 程序中實現文件的壓縮和解壓,可以使用一些第三方庫,如 zlib、libzip、minizip 等。
使用 zlib
zlib 是一個用于數據壓縮的庫。以下是一個簡單的示例,演示如何使用 zlib 壓縮和解壓數據:
安裝 zlib 開發包:
sudo apt-get install zlib1g-dev
示例代碼(壓縮和解壓字符串):
#include <iostream>
#include <vector>
#include <zlib.h>
// 壓縮函數
std::vector<unsigned char> compress(const std::string& data) {
z_stream stream;
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;
deflateInit(&stream, Z_DEFAULT_COMPRESSION);
stream.next_in = (Bytef*)data.data();
stream.avail_in = data.size();
int ret;
std::vector<unsigned char> outbuffer;
do {
outbuffer.resize(outbuffer.size() + 16384);
stream.next_out = (Bytef*)&outbuffer[0] + outbuffer.size() - 16384;
stream.avail_out = 16384;
ret = deflate(&stream, Z_FINISH);
if (outbuffer.size() < stream.total_out) {
outbuffer.resize(outbuffer.size() + 16384);
}
} while (ret == Z_OK);
deflateEnd(&stream);
outbuffer.resize(stream.total_out);
return outbuffer;
}
// 解壓函數
std::string decompress(const std::vector<unsigned char>& data) {
z_stream stream;
stream.zalloc = Z_NULL;
stream.zfree = Z_NULL;
stream.opaque = Z_NULL;
inflateInit(&stream);
stream.next_in = (Bytef*)data.data();
stream.avail_in = data.size();
int ret;
std::string outbuffer;
do {
outbuffer.resize(outbuffer.size() + 16384);
stream.next_out = (Bytef*)&outbuffer[0] + outbuffer.size() - 16384;
stream.avail_out = 16384;
ret = inflate(&stream, Z_NO_FLUSH);
if (outbuffer.size() < stream.total_out) {
outbuffer.resize(outbuffer.size() + 16384);
}
} while (ret == Z_OK);
inflateEnd(&stream);
outbuffer.resize(stream.total_out);
return outbuffer;
}
int main() {
std::string original = "Hello, zlib!";
std::vector<unsigned char> compressed = compress(original);
std::string decompressed = decompress(compressed);
std::cout << "Original: " << original << std::endl;
std::cout << "Decompressed: " << decompressed << std::endl;
return 0;
}
編譯并運行:
g++ -o compress_example compress_example.cpp -lz
./compress_example
使用 libzip
libzip 是一個用于處理 zip 文件的庫。以下是一個簡單的示例,演示如何使用 libzip 創建和解壓 zip 文件:
安裝 libzip 開發包:
sudo apt-get install libzip-dev
示例代碼(創建和解壓 zip 文件):
#include <iostream>
#include <zip.h>
// 創建 zip 文件
void createZip(const std::string& zipFilename, const std::vector<std::string>& files) {
int errorp;
zip_t* zip = zip_open(zipFilename.c_str(), ZIP_CREATE | ZIP_TRUNCATE, &errorp);
if (!zip) {
std::cerr << "Failed to create zip file: " << zipFilename << std::endl;
return;
}
for (const auto& file : files) {
zip_source_t* source = zip_source_file(zip, file.c_str(), 0, 0);
if (!source) {
std::cerr << "Failed to add file to zip: " << file << std::endl;
zip_close(zip);
return;
}
if (zip_file_add(zip, file.c_str(), source, ZIP_FL_ENC_UTF_8) < 0) {
std::cerr << "Failed to add file to zip: " << file << std::endl;
zip_source_free(source);
zip_close(zip);
return;
}
}
if (zip_close(zip) < 0) {
std::cerr << "Failed to close zip file: " << zipFilename << std::endl;
}
}
// 解壓 zip 文件
void extractZip(const std::string& zipFilename, const std::string& destDir) {
int errorp;
zip_t* zip = zip_open(zipFilename.c_str(), 0, &errorp);
if (!zip) {
std::cerr << "Failed to open zip file: " << zipFilename << std::endl;
return;
}
int numEntries = zip_get_num_entries(zip, 0);
for (int i = 0; i < numEntries; ++i) {
struct zip_stat sb;
if (zip_stat_index(zip, i, 0, &sb) == 0) {
std::string filename = destDir + "/" + sb.name;
zip_file_t* file = zip_fopen_index(zip, i, 0);
if (!file) {
std::cerr << "Failed to open file in zip: " << sb.name << std::endl;
continue;
}
FILE* fp = fopen(filename.c_str(), "wb");
if (!fp) {
std::cerr << "Failed to create file: " << filename << std::endl;
zip_fclose(file);
continue;
}
char buffer[1024];
zip_int64_t bytesRead;
while ((bytesRead = zip_fread(file, buffer, sizeof(buffer))) > 0) {
fwrite(buffer, 1, bytesRead, fp);
}
fclose(fp);
zip_fclose(file);
}
}
if (zip_close(zip) < 0) {
std::cerr << "Failed to close zip file: " << zipFilename << std::endl;
}
}
int main() {
std::vector<std::string> files = {"file1.txt", "file2.txt"};
createZip("example.zip", files);
extractZip("example.zip", ".");
return 0;
}
編譯并運行:
g++ -o zip_example zip_example.cpp -lzip
./zip_example
這些示例展示了如何在 Linux 中使用命令行工具和 C++ 庫來實現文件的壓縮和解壓。根據你的需求選擇合適的方法和工具。