Trabalho com ZIP/arquivos em C++: biblioteca libzip e exemplos de código

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++: do simples ao complexo



No desenvolvimento moderno em C++, surge frequentemente a necessidade de empacotar e desempacotar dados. Seja para salvar configurações, transferir logs ou criar backups — o trabalho com arquivos ZIP continua sendo uma das habilidades mais requisitadas. Neste artigo, vamos detalhar duas bibliotecas populares: libzip (oficial, poderosa) e miniz (leve, de único cabeçalho). Você aprenderá a criar, ler e modificar arquivos ZIP, além de obter exemplos de código prontos.



Por que ZIP?

O formato ZIP é o padrão de facto para compressão sem perdas. Ele é suportado por todos os sistemas operacionais, permite armazenar vários arquivos e pastas, além de suportar criptografia e processamento em fluxo. Em C++, não há suporte nativo para ZIP (exceto o experimental <filesystem>), por isso usamos bibliotecas de terceiros.



Biblioteca libzip: ferramenta poderosa para tarefas sérias

libzip é uma biblioteca multiplataforma em C, com uma excelente API compatível com C++. Ela oferece controle total sobre os arquivos: criação, leitura, modificação, exclusão de arquivos, trabalho com comentários e metadados.



Instalação do libzip (Linux/macOS)

# Ubuntu/Debiansudo apt-get install libzip-dev

# macOS (Homebrew)brew install libzip

# Windows — via vcpkg ou baixar do site libzip.org


Exemplo 1: Criando um arquivo ZIP

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

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

int main() { // Abre o arquivo para escrita (APPEND_CREATE criará um novo) int err = 0; zip_t *archive = zip_open("example.zip", ZIP_CREATE | ZIP_TRUNCATE, &err); if (!archive) { std::cerr << "Erro ao criar o arquivo: " << err << std::endl; return 1; }

// Dados para o arquivo const char *content = "Hello from PythonLib!"; zip_source_t *source = zip_source_buffer(archive, content, strlen(content), 0); if (!source) { std::cerr << "Falha ao criar a fonte de dados" << std::endl; zip_close(archive); return 1; }

// Adiciona o arquivo ao ZIP zip_int64_t index = zip_file_add(archive, "hello.txt", source, ZIP_FL_OVERWRITE); if (index < 0) { std::cerr << "Falha 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 com sucesso!" << std::endl; return 0;}


Exemplo 2: Extraindo todos os arquivos de um ZIP

Vamos ler o arquivo e extrair todos os arquivos para o diretório atual.

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

int main() { int err = 0; zip_t *archive = zip_open("example.zip", ZIP_RDONLY, &err); if (!archive) { std::cerr << "Erro ao abrir o arquivo" << 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 arquivo dentro do ZIP zip_file_t *zf = zip_fopen_index(archive, i, 0); if (!zf) { std::cerr << "Falha ao abrir: " << filename << std::endl; continue; }

// Lê os dados e escreve no arquivo char buffer[1024]; std::ofstream out(filename, std::ios::binary); zip_int64_t bytes_read; while ((bytes_read = zip_fread(zf, buffer, sizeof(buffer))) > 0) { out.write(b

Recommendations