Travailler avec les archives ZIP 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

Travailler avec les archives ZIP en Rust à l'aide de la bibliothèque zip



Lors du développement en Rust, il est souvent nécessaire de compresser des fichiers dans des archives ZIP ou d'en extraire des données. Cela peut être utile pour distribuer des logiciels, créer des sauvegardes, traiter des archives téléchargées par les utilisateurs ou assembler des paquets. La bibliothèque standard de Rust n'inclut pas d'outils intégrés pour travailler avec ZIP, mais l'écosystème propose une bibliothèque puissante et pratique zip.



Dans cet article, nous allons voir en détail comment utiliser la bibliothèque zip pour créer, lire et extraire des archives ZIP. Vous apprendrez à installer la bibliothèque, à travailler avec des fichiers et des répertoires, à gérer les erreurs et à contrôler la compression.



Installation de la bibliothèque zip



Pour commencer, ajoutez la dépendance dans le fichier Cargo.toml de votre projet :



[dependencies]zip = "2.2"


La bibliothèque est activement maintenue et utilise les fonctionnalités modernes de Rust. Après avoir ajouté la dépendance, vous pouvez l'importer dans votre code :



use zip::ZipWriter;use zip::read::ZipArchive;use std::io::{Read, Write, BufWriter, BufReader};use std::fs::{self, File};


Création d'une archive ZIP



La création d'une archive comprend plusieurs étapes : ouvrir un fichier en écriture, initialiser ZipWriter, ajouter des fichiers et finaliser l'écriture. Voici un exemple qui compresse un fichier texte :



use std::fs::File;use zip::ZipWriter;use zip::write::FileOptions;use std::io::Write;

fn create_archive() -> zip::result::ZipResult<()> { let file = File::create("example.zip")?; let mut zip = ZipWriter::new(file);

let options = FileOptions::default() .compression_method(zip::CompressionMethod::Deflated) .unix_permissions(0o755);

zip.start_file("hello.txt", options)?; zip.write_all(b"Bonjour, Rust ZIP !")?;

zip.finish()?; Ok(())}


Ici, nous :

  • Créons le fichier example.zip dans le répertoire courant.
  • Initialisons ZipWriter.
  • Configurons les paramètres du fichier : méthode de compression Deflated (compression standard) et droits d'accès.
  • Ajoutons le fichier hello.txt et y écrivons le contenu.
  • Finalisons l'écriture en appelant finish().


Pour ajouter plusieurs fichiers ou un répertoire entier, utilisez une boucle sur les fichiers du dossier :



fn add_directory(zip: &mut ZipWriter<File>, dir_path: &str) -> zip::result::ZipResult<()> {    for entry in walkdir::WalkDir::new(dir_path) {        let entry = entry?;        let path = entry.path();        if path.is_file() {            let name = path.strip_prefix(dir_path).unwrap().to_str().unwrap();            zip.start_file(name, FileOptions::default())?;            let mut f = File::open(path)?;            std::io::copy(&mut f, zip)?;        }    }    Ok(())}


Remarque : pour parcourir récursivement les répertoires, il est pratique d'utiliser la crate walkdir, mais elle doit être ajoutée séparément.



Lecture et extraction d'une archive ZIP



Pour lire une archive, on utilise ZipArchive. Voici un exemple qui affiche la liste des fichiers dans l'archive et les extrait dans un dossier spécifié :



use zip::ZipArchive;use std::io::Read;

fn extract_archive(archive_path: &str, output_dir: &str) -> zip::result::ZipResult<()> { let file = File::open(archive_path)?; let mut archive = ZipArchive::new(file)?;

for i in 0..archive.len() { let mut entry = archive.by_index(i)?; let entry_name = entry.name().to_string(); println!("Extraction en cours : {}", entry_name);

// Créons le chemin complet du fichier let output_path = format!("{}/{}", output_dir, entry_nam

Recommendations