Trabajo con archivos ZIP en Rust: biblioteca zip para crear y descomprimir archivos

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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:



<                    

Recommendations