Ce projet consiste à développer une application en ligne de commande pour analyser l’utilisation de l’espace disque. Il est divisé en deux parties principales :
-
Analyseur d’utilisation de l’espace disque Cette partie effectue un parcours récursif d’un chemin donné, calcule la taille de chaque fichier et sous-répertoire rencontré, et génère un arbre hiérarchique des fichiers avec leur taille associée.
-
Détection de fichiers dupliqués Cette fonctionnalité identifie les fichiers dupliqués au sein de l’arbre de fichiers en utilisant des signatures uniques générées via des fonctions de hachage.
|
Note
|
|
L’interface en ligne de commande est facilitée par la bibliothèque clap.
Clap permet la gestion de sous-commandes sur le terminal. Par exemple la sous-commande help affichera la liste des sous-commandes disponibles.
$ cargo run -- help
Usage: du <COMMAND>
Commands:
usage Show the disk usage tree for the given path
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
-V, --version Print versionPour lancer l’analyseur de disque ,avec la sous-commande 'usage', qui prends comme argument le sous-répertoire à analyser. Par exemple, pour analyser le répertoire courant "." vous écrirez sur le terminal :
cargo run -- usage .L’objectif de la sous-commande usage est d’afficher un arbre d’utilisation de l’espace disque. Dans l’exemple ci-dessous, on affiche l’arbre d’un répertoire contenant plusieurs albums de musique.
$ cargo run -- usage "/Music/Dead Can Dance"
207 MiB /Music/Dead Can Dance
79.8 MiB /Music/Dead Can Dance/Into The Labyrinth
13.3 MiB /Music/Dead Can Dance/Into The Labyrinth/11 How Fortunate The Man With None.mp3
10.2 MiB /Music/Dead Can Dance/Into The Labyrinth/07 Towards The Within.mp3
10 MiB /Music/Dead Can Dance/Into The Labyrinth/01 Yulunga (Spirit Dance).mp3
9.7 MiB /Music/Dead Can Dance/Into The Labyrinth/09 Spider's Stratagem.mp3
9.1 MiB /Music/Dead Can Dance/Into The Labyrinth/02 Ubiquitous Mr Lovegrove.mp3
8.2 MiB /Music/Dead Can Dance/Into The Labyrinth/08 Tell Me About The Forest (You Once Called Home).mp3
7.9 MiB /Music/Dead Can Dance/Into The Labyrinth/04 Carnival Is Over.mp3
4.1 MiB /Music/Dead Can Dance/Into The Labyrinth/03 Wind That Shakes The Barley.mp3
3 MiB /Music/Dead Can Dance/Into The Labyrinth/10 Emmeleia.mp3
2.7 MiB /Music/Dead Can Dance/Into The Labyrinth/05 Ariadne.mp3
1.6 MiB /Music/Dead Can Dance/Into The Labyrinth/06 Saldek.mp3
12.5 KiB /Music/Dead Can Dance/Into The Labyrinth/artwork.jpg
74.8 MB /Music/Dead Can Dance/Spirit Chaser
14.7 MiB /Music/Dead Can Dance/Spirit Chaser/02 Song Of The Stars.mp3
13.5 MiB /Music/Dead Can Dance/Spirit Chaser/03 Indus.mp3
11.5 MiB /Music/Dead Can Dance/Spirit Chaser/07 Song Of The Nile.mp3
9 MiB /Music/Dead Can Dance/Spirit Chaser/08 Devorzhum.mp3
8.9 MiB /Music/Dead Can Dance/Spirit Chaser/06 The Snake And The Moon.mp3
8.3 MiB /Music/Dead Can Dance/Spirit Chaser/01 Nierika.mp3
7.1 MiB /Music/Dead Can Dance/Spirit Chaser/04 Song Of The Disposessed.mp3
12.5 KiB /Music/Dead Can Dance/Spirit Chaser/artwork.jpg
...La classe Size sert a gérer les tailles des fichiers.
Size permet de stocker une taille en octets.
-
Implémentation du constructeur
Size::new(bytes: u64) → Selfqui permet d’initialiser un objet size de taillebytes: u64. -
Implémentation du trait
std::ops::Addpour la classe Size, de manière à pouvoir additionner deux objects de typeSize. -
Modification de l’implémentation du trait
fmt::Displayde manière à afficher la taille dans un format compréhensible par un humain. Par exemple, pourSize(1024)⇒1KiB, et pourSize(2411724)⇒2.3MiB.
Ici est une classe permettant de représenter un arbre de fichiers.
La structure FileTree représentera un arbre de fichiers. L’arbre est composé de répertoires et de fichiers. Chaque nœud de l’arbre sera identifié par son chemin sur le disque.
FileTree possède deux champs:
-
rootdonne le nom du répertoire racine de l’arbre. -
mapest une table de hachage qui associe à chaque nœud (identifié par son chemin) un objetEntryNode.
L’objet EntryNode capturera les informations d’un fichier ou d’un sous-répertoire. Pour les fichiers, elle contient la taille du fichier. Pour les répertoires, elle devra contenir une liste des « enfants » du répertoire, c’est à dire, une liste des chemins des fichiers et sous-répertoires immédiatement contenus par ce répertoire.
Un certain nombre de méthodes publiques associées à FileTree implémentées:
-
pub fn new(root: &Path) → std::io::Result<FileTree>est un constructeur qui retourne l’arbre de fichiers pour le chemin racineroot. -
pub fn get_root(&self) → &Pathrenvoie le chemin racine de l’arbre. -
pub fn get_size(&self, index: &Path) → Option<Size>renvoie la taille du chemin passé (uniquement si ce chemin existe dans l’arbre associé). -
pub fn get_children(&self, index: &Path) → Option<&[PathBuf]>renvoie une tranche contenant les enfants d’un chemin (uniquement si ce chemin est trouvé dans l’arbre). -
pub fn files(&self) → Vec<PathBuf>renvoie un vecteur contenant tous les fichiers (et uniquement les fichiers) de l’arbre.
|
Note
|
La taille d’un répertoire est la taille totale de tous les fichiers et sous-répertoires qu’il contient de manière récursive. |
l’affichage l’arbre sur le terminal se fait de manière à découpler le programme, la méthode d’affichage, pub fn show(&self), qui est implémentée dans le fichier print_tree.rs.
-
Trier les nœuds à chaque niveau de l’arbre par taille décroissante.
-
Trier l’arbre selon l’ordre lexicographique des chemins (Une option dans clap (
--lexicographic-sort)). -
Ajout d’une option dans clap (
--filter .jpg) pour filtrer les nœuds de l’arbre. Par exemple--filter .jpgaffichera: les fichiers terminant par.jpget tous les répertoires qui contiennent un fichier de ce type (même par transitivité).
Il s’agit d’une implémentation d’un détecteur de doublons qui sera invoqué avec la sous-commande clap cargo run — duplicates PATH où PATH est le chemin racine. Cette commande trouvera tous les fichiers dupliqués au sein de PATH et affichera les doublons détéctés.
Ici , on compare tous les fichiers deux à deux a un coût prohibitif avec la méthode suivante:
-
Génerer l’arbre de fichiers correspondant à la racine
PATH. -
Pour chacun des fichiers de l’arbre, calculer une signature à l’aide d’une fonction cryptographique (hachage) 'SHA256'.
-
Parcourir les signatures générées et retrouver les doublons.
Ce projet s’inspire du sujet du Projet 23/24 proposé dans le cadre du cours Programmation Efficace de l’Université de Versailles Saint-Quentin-en-Yvelines (UVSQ). J’ai choisi ce sujet pour approfondir mes compétences en Rust tout en appliquant les concepts étudiés en cours à un cas concret et pratique.