Trabalho com ZIP/arquivos em C++: bibliotecas libzip e zlib

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Trabalho com arquivos ZIP em C++: libzip e zlib



No desenvolvimento moderno em C++, frequentemente surge a necessidade de empacotar e desempacotar dados. Os arquivos ZIP continuam sendo um dos formatos mais populares devido à sua versatilidade e suporte à compressão. Neste artigo, abordaremos duas bibliotecas principais para trabalhar com ZIP em C++: libzip (trabalho de alto nível com arquivos) e zlib (compressão de baixo nível). Você aprenderá como instalar as bibliotecas, criar um arquivo, extrair arquivos e ler o conteúdo sem descompactar.



Principais bibliotecas para trabalhar com ZIP em C++

  • libzip — biblioteca multiplataforma para criar, ler e modificar arquivos ZIP. Suporta criptografia, fluxos e trabalho com memória.
  • zlib — biblioteca de compressão de dados de baixo nível (algoritmo Deflate). Usada como base para libzip e outros arquivadores.
  • minizip — wrapper leve sobre zlib para trabalhar com o formato ZIP (frequentemente incluído na composição do zlib).

Para a maioria das tarefas, recomenda-se usar libzip, pois ela oferece uma API mais conveniente e segura.



Instalação das bibliotecas

No Linux (Ubuntu/Debian), a instalação é feita através do gerenciador de pacotes:

sudo apt-get install libzip-dev zlib1g-dev

Para macOS (Homebrew):

brew install libzip zlib

No Windows, você pode usar vcpkg ou baixar os binários compilados dos sites oficiais.

Conexão no CMakeLists.txt:

find_package(ZLIB REQUIRED)find_package(LibZip REQUIRED)target_link_libraries(your_project ZLIB::ZLIB libzip::zip)


Exemplo 1: Criando um arquivo ZIP com libzip

Vamos criar o arquivo example.zip e adicionar um arquivo de texto:

#include <zip.h>#include <iostream>#include <string>

int main() { const char* archive_name = "example.zip"; int err = 0;

// Abre o arquivo para escrita zip_t* archive = zip_open(archive_name, ZIP_CREATE | ZIP_TRUNCATE, &err); if (!archive) { std::cerr << "Erro ao criar o arquivo: " << err << std::endl; return 1; }

// Dados para escrever const char* filename = "hello.txt"; const char* content = "Olá, mundo! Hello, C++!"; // Cria uma fonte de dados a partir da memória zip_source_t* source = zip_source_buffer(archive, content, strlen(content), 0); if (!source) { std::cerr << "Erro ao criar a fonte" << std::endl; zip_close(archive); return 1; }

// Adiciona o arquivo ao arquivo ZIP zip_int64_t index = zip_file_add(archive, filename, source, ZIP_FL_OVERWRITE); if (index < 0) { std::cerr << "Erro ao adicionar o arquivo: " << zip_strerror(archive) << std::endl; zip_source_free(source); zip_close(archive); return 1; }

// Fecha o arquivo zip_close(archive); std::cout << "Arquivo criado: " << archive_name << std::endl; return 0;}


Exemplo 2: Descompactando um arquivo ZIP

Vamos extrair todos os arquivos do arquivo ZIP para o diretório atual:

#include <zip.h>#include <iostream>#include <fstream>

int main() { const char* archive_name = "example.zip"; int err = 0;

// Abre o arquivo para leitura zip_t* archive = zip_open(archive_name, 0, &err); if (!archive) { std::cerr << "Erro ao abrir o arquivo: " << err << std::endl; return 1; }

zip_int64_t num_entries = zip_get_num_entries(archive, 0); for (zip_int64_t i = 0; i < num_entries; ++i) { // Obtém o nome do arquivo const char* filename = zip_get_name(archive, i, 0); if (!filename) continue;

// Abre o ar

Recommendations