Travailler avec les ZIP/archives en Rust : bibliothèque zip et guide complet

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

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

Recommendations