Travailler avec les archives ZIP en Rust : la bibliothèque zip pour créer et extraire des archives

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

La bibliothèque zip pour travailler avec les archives en Rust



Dans le développement moderne en Rust, il est souvent nécessaire de compresser des données dans des archives ZIP ou de les en extraire. Que ce soit pour créer des sauvegardes, distribuer des logiciels ou traiter des fichiers utilisateur, la bibliothèque zip est la solution standard pour cette tâche. Elle fournit une API pratique pour lire, écrire et modifier des archives ZIP, en prenant en charge à la fois le traitement par flux et le travail en mémoire.



Installation et configuration



Pour commencer, ajoutez la dépendance à votre fichier Cargo.toml :



[dependencies]zip = "2.1"


La crate std::io peut également être nécessaire pour travailler avec les flux de données, mais elle fait déjà partie de la bibliothèque standard de Rust.



Création d'une nouvelle archive ZIP



Prenons un exemple simple : la création d'une archive avec un seul fichier texte. Pour cela, on utilise ZipWriter, qui encapsule tout type implémentant 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"Bonjour, Rust ZIP !")?;

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


Notez la méthode start_file : elle commence l'écriture d'un nouveau fichier dans l'archive. Vous pouvez lui passer des options de compression, une date de modification et d'autres paramètres.



Lecture et extraction de fichiers



Pour lire une archive, on utilise ZipArchive. Il permet de parcourir toutes les entrées et d'extraire leur contenu :



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(())}


La méthode by_index renvoie une entrée spécifique par son index. La recherche par nom est également disponible via by_name, mais gardez à l'esprit que les noms dans les ZIP peuvent être dans différents encodages.



Ajout de fichiers à une archive existante



La bibliothèque zip prend également en charge l'ajout de nouveaux fichiers à une archive déjà créée. Cela se fait à l'aide de la méthode raw_copy_file ou en ouvrant l'archive en mode ajout :



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"Ajouté plus tard !")?;

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


Important : pour ajouter un fichier, l'archive doit être ouverte avec les droits de lecture et d'écriture, et le fichier lui-même ne doit pas être corrompu.



Travailler avec différents types de compression



Par défaut, la bibliothèque utilise la méthode Deflated (compression ZIP standard). Vous pouvez la changer en Stored (sans compression) ou d'autres méthodes en passant les options correspondantes :



use zip::CompressionMethod;use zip::write::FileOptions;

let options = FileOptions::default() .compression_method(CompressionMethod::Stored);// oulet options = FileOptions::default() .compression_method(CompressionMethod::Deflated);


Si vous avez besoin d'une compression maximale, spécifiez le niveau :



<                    

Recommendations