溫馨提示×

C++如何在Linux實現文件壓縮與解壓

小樊
40
2025-09-13 05:51:40
欄目: 編程語言

在Linux系統中,可以使用多種工具和庫來實現文件的壓縮和解壓。以下是一些常用的方法和示例:

使用命令行工具

  1. gzip 和 gunzip

    • 壓縮文件:

      gzip filename
      

      這將生成一個名為 filename.gz 的壓縮文件,并刪除原始文件。

    • 解壓文件:

      gunzip filename.gz
      

      這將解壓 filename.gz 并恢復原始文件。

  2. 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
      
  3. zip 和 unzip

    • 壓縮文件或目錄:

      zip -r archive.zip /path/to/directory_or_file
      
    • 解壓 zip 文件:

      unzip archive.zip
      

使用 C++ 庫

如果你想在 C++ 程序中實現文件的壓縮和解壓,可以使用一些第三方庫,如 zlib、libzip、minizip 等。

  1. 使用 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
    
  2. 使用 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++ 庫來實現文件的壓縮和解壓。根據你的需求選擇合適的方法和工具。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女