Biblioteca zip para trabajar con archivos en Rust
En el desarrollo moderno con Rust, a menudo surge la necesidad de empaquetar datos en archivos ZIP o extraerlos de ellos. Ya sea para crear copias de seguridad, distribuir software o procesar archivos de usuario, la biblioteca zip es la solución estándar para esta tarea. Proporciona una API conveniente para leer, escribir y modificar archivos ZIP, admitiendo tanto el procesamiento por flujo como el trabajo en memoria.
Instalación y configuración
Para comenzar, agregue la dependencia a su Cargo.toml:
[dependencies]zip = "2.1"También puede ser necesario el crate std::io para trabajar con flujos de datos, que ya está incluido en la biblioteca estándar de Rust.
Creación de un nuevo archivo ZIP
Veamos un ejemplo simple: la creación de un archivo con un solo archivo de texto. Para esto se utiliza ZipWriter, que envuelve cualquier tipo que implemente Write:
use std::fs::File;use std::io::Write;use zip::write::FileOptions;use zip::ZipWriter;
fn main() -> zip::result::ZipResult<()> { let file = File::create("example.zip")?; let mut zip = ZipWriter::new(file);
zip.start_file("hello.txt", FileOptions::default())?; zip.write_all(b"Hello, Rust ZIP!")?;
zip.finish()?; Ok(())}Tenga en cuenta el método start_file: comienza a escribir un nuevo archivo dentro del archivo ZIP. Puede pasarle opciones de compresión, fecha de modificación y otros parámetros.
Lectura y extracción de archivos
Para leer un archivo ZIP se utiliza ZipArchive. Permite iterar sobre todas las entradas y extraer su contenido:
use std::fs::File;use std::io::Read;use zip::ZipArchive;
fn main() -> zip::result::ZipResult<()> { let file = File::open("example.zip")?; let mut archive = ZipArchive::new(file)?;
for i in 0..archive.len() { let mut entry = archive.by_index(i)?; let name = entry.name().to_string(); let mut content = String::new(); entry.read_to_string(&mut content)?; println!("{}: {}", name, content); } Ok(())}El método by_index devuelve una entrada específica por índice. También está disponible la búsqueda por nombre mediante by_name, pero tenga en cuenta que los nombres en ZIP pueden estar en diferentes codificaciones.
Adición de archivos a un archivo ZIP existente
La biblioteca zip también admite agregar nuevos archivos a un archivo ZIP ya creado. Esto se hace mediante el método raw_copy_file o abriendo el archivo en modo de adición:
use std::fs::File;use std::io::Write;use zip::write::FileOptions;use zip::ZipWriter;
fn append_to_zip() -> zip::result::ZipResult<()> { let file = File::options() .read(true) .write(true) .open("example.zip")?; let mut zip = ZipWriter::new_append(file)?;
zip.start_file("new_file.txt", FileOptions::default())?; zip.write_all(b"Added later!")?;
zip.finish()?; Ok(())}Importante: para agregar un archivo, el archivo ZIP debe abrirse con permisos de lectura y escritura, y el archivo en sí no debe estar dañado.
Trabajo con diferentes tipos de compresión
Por defecto, la biblioteca utiliza el método Deflated (compresión ZIP estándar). Puede cambiarlo a Stored (sin compresión) u otros métodos, pasando las opciones correspondientes:
use zip::CompressionMethod;use zip::write::FileOptions;
let options = FileOptions::default() .compression_method(CompressionMethod::Stored);// olet options = FileOptions::default() .compression_method(CompressionMethod::Deflated);Si necesita la máxima compresión, especifique el nivel:
<
También en la biblioteca
cron para Go: guía completa con ejemplos prácticos
Cast para Go: guía completa con ejemplos prácticos
Parseo de HTML en TypeScript: bibliotecas, herramientas y ejemplos de código
Event Bus y el patrón Observer en Go (Golang): implementación y ejemplos
Kafka Client para Java: guía completa con ejemplos