Biblioteca zip para Rust: guia completo para trabalhar com arquivos ZIP
No desenvolvimento moderno em Rust, trabalhar com arquivos é uma tarefa comum. Seja para empacotar logs, descompactar configurações ou criar backups — a biblioteca padrão zip (crate zip) é a solução de facto para ler e escrever arquivos ZIP. Neste artigo, abordaremos detalhadamente como instalar a biblioteca, criar um arquivo, extrair arquivos e também exploraremos técnicas avançadas: trabalho com senhas, streams e grandes volumes de dados.
Instalação e configuração
Adicione a dependência no Cargo.toml:
[dependencies]zip = "2.1"Depois disso, importe os módulos necessários no código:
use std::fs::File;use std::io::{Read, Write, BufReader, BufWriter};use zip::ZipWriter;use zip::write::FileOptions;use zip::read::ZipArchive;Criação de um arquivo ZIP
Para criar um novo arquivo, utiliza-se ZipWriter. Vejamos um exemplo básico — empacotaremos dois arquivos de texto:
use std::fs::File;use std::io::Write;use zip::ZipWriter;use zip::write::FileOptions;
fn create_archive() -> zip::result::ZipResult<()> { let file = File::create("example.zip")?; let mut zip = ZipWriter::new(file);
// Adiciona o primeiro arquivo zip.start_file("hello.txt", FileOptions::default())?; zip.write_all(b"Hello, Rust archive!")?;
// Adiciona o segundo arquivo com compressão let options = FileOptions::default() .compression_method(zip::CompressionMethod::Deflated) .unix_permissions(0o755); zip.start_file("data/config.json", options)?; zip.write_all(b"{\\"version\\": 1}")?;
zip.finish()?; Ok(())}Importante: o método start_file abre um novo arquivo dentro do arquivo ZIP. As opções permitem definir o método de compressão (por padrão Stored — sem compressão, Deflated — compressão ZIP padrão).
Leitura e extração do arquivo
Para leitura, utiliza-se ZipArchive. Abaixo, uma função que lista os arquivos e os extrai para o diretório atual:
use std::fs::File;use std::io::{Read, BufReader};use zip::ZipArchive;
fn extract_archive() -> zip::result::ZipResult<()> { let file = File::open("example.zip")?; let reader = BufReader::new(file); let mut archive = ZipArchive::new(reader)?;
for i in 0..archive.len() { let mut entry = archive.by_index(i)?; let name = entry.name().to_string(); println!("Extraindo: {}", name);
// Cria o arquivo no disco let mut output = File::create(&name)?; std::io::copy(&mut entry, &mut output)?; } Ok(())}O método by_index retorna um iterador sobre as entradas. Se precisar de acesso pelo nome, use by_name("path/to/file.txt"). Observe que os nomes no ZIP podem conter caminhos com o separador / — isso é normal para compatibilidade entre plataformas.
Trabalhando com senhas (criptografia)
A biblioteca zip suporta criptografia baseada em senha através do algoritmo AES (padrão AES-256). Para criar um arquivo criptografado:
use zip::ZipWriter;use zip::write::FileOptions;use zip::AesMode;
fn create_encrypted_archive() -> zip::result::ZipResult<()> { let file = File::create("secret.zip")?; let mut zip = ZipWriter::new(file);
let options = FileOptions::default() .compression_method(zip::CompressionMethod::Deflated) .with_aes_encryption(AesMode::Aes256, "my_strong_password");
zip.start_file("secret.txt", options)?; zip.write_all(b"Top secret data")?; zip.finish()?; Ok(())}Para ler um arquivo criptografado, passe a senha no método by_index_decrypt ou by_n
Também na biblioteca
Geração de Relatórios PDF em Kotlin: iText, Apache PDFBox, OpenPDF
Envio de SMS em JavaScript (Node.js): API, bibliotecas e exemplos de código
Event Bus e o padrão Observer em Java: implementação de arquitetura fracamente acoplada
Matchers do Catch2 para C++: guia completo com exemplos práticos
Doctrine DBAL para PHP: guia completo com exemplos práticos