Trabalho com ZIP/arquivos em C++: bibliotecas 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 ZIP/arquivos em C++: visão geral das bibliotecas e exemplos práticos



A arquivação de dados é uma das tarefas principais no desenvolvimento de software. Em C++ não há suporte nativo para o formato ZIP, no entanto, existem várias bibliotecas maduras e testadas que permitem compactar, descompactar e modificar arquivos ZIP facilmente. Neste artigo, veremos as principais ferramentas: zlib, minizip e libzip, além de apresentar exemplos práticos de código.



1. Conceitos básicos de trabalho com ZIP em C++



ZIP é um formato de compressão sem perdas que suporta vários algoritmos (Deflate, BZip2, LZMA). Para trabalhar com ele em C++, geralmente são usadas três abordagens:



  • Trabalho direto com zlib — compressão/descompressão de baixo nível de fluxos de dados, mas sem suporte à estrutura do arquivo ZIP.
  • minizip — uma camada sobre o zlib que fornece funções para criar e ler arquivos ZIP.
  • libzip — biblioteca completa com suporte para editar, excluir e adicionar arquivos em arquivos existentes.


2. Biblioteca zlib



zlib é uma biblioteca de compressão fundamental na qual muitas soluções ZIP são baseadas. Ela fornece as funções compress() e uncompress() para trabalhar com dados brutos.



Exemplo: compressão de uma string com zlib



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

int main() { std::string input = "Exemplo de texto para compressão em C++!"; uLong srcLen = input.size(); uLong destLen = compressBound(srcLen); char* compressed = new char[destLen]; if (compress((Bytef*)compressed, &destLen, (const Bytef*)input.data(), srcLen) == Z_OK) { std::cout << "Comprimido: " << srcLen << " -> " << destLen << " bytes"; } delete[] compressed; return 0;}


Nota: Para trabalhar com zlib, é necessário incluir o arquivo de cabeçalho zlib.h e vincular com a biblioteca -lz.



3. Biblioteca minizip



minizip é um wrapper leve sobre o zlib que permite criar e extrair arquivos ZIP. Ele é distribuído como parte dos fontes do zlib (pasta contrib/minizip).



Exemplo: criação de um arquivo ZIP com um único arquivo



#include <iostream>#include <zip.h>  // minizip

int main() { zipFile zf = zipOpen("example.zip", APPEND_STATUS_CREATE); if (!zf) { std::cerr << "Erro ao criar o arquivo"; return 1; } zip_fileinfo info = {0}; const char* filename = "test.txt"; const char* content = "Hello from minizip!"; if (zipOpenNewFileInZip(zf, filename, &info, nullptr, 0, nullptr, 0, nullptr, Z_DEFLATED, Z_DEFAULT_COMPRESSION) == ZIP_OK) { zipWriteInFileInZip(zf, content, strlen(content)); zipCloseFileInZip(zf); } zipClose(zf, nullptr); std::cout << "Arquivo criado: example.zip"; return 0;}


Exemplo: extração de todos os arquivos de um ZIP



#include <iostream>#include <unzip.h>

int main() { unzFile uf = unzOpen("example.zip"); if (!uf) { std::cerr << "Não foi possível abrir o arquivo"; return 1; } unz_global_info global_info; unzGetGlobalInfo(uf, &global_info); for (uLong i = 0; i < global_info.number_entry; ++i) { char filename[256]; unz_file_info file_info; unzGetCurrentFileInfo(uf, &file_info, filename, sizeof(filename), nullptr, 0, nullptr, 0); if (unzOpenCurrentFile(uf) == UNZ_OK) { c

Recommendations