Trabajo con archivos ZIP en C++: de lo simple a lo complejo
En el desarrollo moderno con C++, a menudo surge la necesidad de empaquetar y descomprimir datos. Ya sea para guardar configuraciones, transferir registros o crear copias de seguridad, trabajar con archivos ZIP sigue siendo una de las habilidades más demandadas. En este artículo, analizaremos en detalle dos bibliotecas populares: libzip (oficial, potente) y miniz (ligera, de un solo encabezado). Aprenderá a crear, leer y modificar archivos ZIP, y también obtendrá ejemplos de código listos para usar.
¿Por qué ZIP?
El formato ZIP es el estándar de facto para la compresión sin pérdidas. Es compatible con todos los sistemas operativos, permite almacenar múltiples archivos y carpetas, y también admite cifrado y procesamiento por flujos. En C++ no hay soporte integrado para ZIP (excepto el experimental <filesystem>), por lo que utilizamos bibliotecas de terceros.
Biblioteca libzip: una herramienta potente para tareas serias
libzip es una biblioteca multiplataforma en C, con una excelente API compatible con C++. Proporciona control total sobre los archivos: creación, lectura, modificación, eliminación de archivos, trabajo con comentarios y metadatos.
Instalación de libzip (Linux/macOS)
# Ubuntu/Debiansudo apt-get install libzip-dev
# macOS (Homebrew)brew install libzip
# Windows — a través de vcpkg o descargar desde libzip.orgEjemplo 1: Creación de un archivo ZIP
Crearemos un archivo example.zip y añadiremos un archivo de texto.
#include <zip.h>#include <iostream>#include <string>
int main() { // Abrimos el archivo para escritura (APPEND_CREATE creará uno nuevo) int err = 0; zip_t *archive = zip_open("example.zip", ZIP_CREATE | ZIP_TRUNCATE, &err); if (!archive) { std::cerr << "Error al crear el archivo: " << err << std::endl; return 1; }
// Datos para el archivo const char *content = "¡Hola desde PythonLib!"; zip_source_t *source = zip_source_buffer(archive, content, strlen(content), 0); if (!source) { std::cerr << "No se pudo crear la fuente de datos" << std::endl; zip_close(archive); return 1; }
// Añadimos el archivo al ZIP zip_int64_t index = zip_file_add(archive, "hello.txt", source, ZIP_FL_OVERWRITE); if (index < 0) { std::cerr << "No se pudo añadir el archivo: " << zip_strerror(archive) << std::endl; zip_source_free(source); zip_close(archive); return 1; }
// Cerramos el archivo zip_close(archive); std::cout << "¡Archivo creado exitosamente!" << std::endl; return 0;}Ejemplo 2: Descompresión de todos los archivos de un ZIP
Leeremos el archivo y extraeremos todos los archivos al directorio actual.
#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 << "Error al abrir el archivo" << 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) { // Obtenemos el nombre del archivo const char *filename = zip_get_name(archive, i, 0); if (!filename) continue;
// Abrimos el archivo dentro del ZIP zip_file_t *zf = zip_fopen_index(archive, i, 0); if (!zf) { std::cerr << "No se pudo abrir: " << filename << std::endl; continue; }
// Leemos los datos y los escribimos en un archivo 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 También en la biblioteca
Limitación de Tasa en C# (.NET): Guía Completa de la Biblioteca System.Threading.RateLimiting
Generación de informes PDF en C# (.NET) con iTextSharp y QuestPDF
Trabajo con CSV en Swift (iOS/macOS) — bibliotecas y ejemplos de código
Trabajo con Excel en Go (Golang): bibliotecas, ejemplos y herramientas
Event Bus y el patrón Observer en Swift: implementación y ejemplos