Bibliothèque zip pour Rust : guide complet pour travailler avec les archives ZIP
Dans le développement moderne en Rust, travailler avec les archives est une tâche courante. Qu'il s'agisse de compresser des logs, de décompresser des configurations ou de créer des sauvegardes, la bibliothèque standard zip (crate zip) est la solution de facto pour lire et écrire des fichiers ZIP. Dans cet article, nous allons détailler comment installer la bibliothèque, créer une archive, extraire des fichiers, et également aborder des techniques avancées : travail avec les mots de passe, les flux et les grandes données.
Installation et configuration
Ajoutez la dépendance dans Cargo.toml :
[dependencies]zip = "2.1"Ensuite, importez les modules nécessaires dans le code :
use std::fs::File;use std::io::{Read, Write, BufReader, BufWriter};use zip::ZipWriter;use zip::write::FileOptions;use zip::read::ZipArchive;Création d'une archive ZIP
Pour créer une nouvelle archive, on utilise ZipWriter. Voici un exemple de base : compressons deux fichiers texte :
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);
// Ajout du premier fichier zip.start_file("hello.txt", FileOptions::default())?; zip.write_all(b"Bonjour, archive Rust !")?;
// Ajout du deuxième fichier avec compression 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(())}Important : la méthode start_file ouvre un nouveau fichier dans l'archive. Les options permettent de définir la méthode de compression (par défaut Stored — sans compression, Deflated — compression ZIP standard).
Lecture et extraction d'une archive
Pour la lecture, on utilise ZipArchive. Ci-dessous, une fonction qui affiche la liste des fichiers et les extrait dans le répertoire courant :
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!("Extraction : {}", name);
// Création du fichier sur le disque let mut output = File::create(&name)?; std::io::copy(&mut entry, &mut output)?; } Ok(())}La méthode by_index retourne un itérateur sur les entrées. Si vous avez besoin d'un accès par nom, utilisez by_name("chemin/vers/fichier.txt"). Notez que les noms dans ZIP peuvent contenir des chemins avec le séparateur / — c'est normal pour la compatibilité multiplateforme.
Travailler avec les mots de passe (chiffrement)
La bibliothèque zip prend en charge le chiffrement par mot de passe via l'algorithme AES (par défaut AES-256). Pour créer une archive chiffrée :
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, "mon_mot_de_passe_fort");
zip.start_file("secret.txt", options)?; zip.write_all(b"Données top secrètes")?; zip.finish()?; Ok(())}Pour lire une archive chiffrée, transmettez le mot de passe à la méthode by_index_decrypt ou by_n
Aussi dans la bibliothèque
Générateur de QR codes en TypeScript : qrcode.js et qrcode-generator
log — Journalisation pour Rust
Génération Swagger/OpenAPI pour C++ : aperçu des outils et bibliothèques
MassTransit pour C# (.NET) : guide complet avec exemples