Skip to content

machterMassi06/disk_space_analyzer

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Analyseur d’espace disque

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 :

  1. 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.

  2. 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
  • Le projet est géré avec cargo et est structuré en plusieurs modules et fichiers.

Partie I : Analyseur de disque

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 version

Pour 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
      ...

Implémentation d’un type Size

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) → Self qui permet d’initialiser un objet size de taille bytes: u64.

  • Implémentation du trait std::ops::Add pour la classe Size, de manière à pouvoir additionner deux objects de type Size.

  • Modification de l’implémentation du trait fmt::Display de manière à afficher la taille dans un format compréhensible par un humain. Par exemple, pour Size(1024)1KiB, et pour Size(2411724)2.3MiB.

Implémentation de l’arbre de fichiers

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:

  • root donne le nom du répertoire racine de l’arbre.

  • map est une table de hachage qui associe à chaque nœud (identifié par son chemin) un objet EntryNode.

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 racine root.

  • pub fn get_root(&self) → &Path renvoie 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.

Affichage de l’arbre

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.

Tri et filtrage

  • 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 .jpg affichera: les fichiers terminant par .jpg et tous les répertoires qui contiennent un fichier de ce type (même par transitivité).

Partie II : Détecteur de doublons

Il s’agit d’une implémentation d’un détecteur de doublons qui sera invoqué avec la sous-commande clap cargo run — duplicates PATHPATH 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.

Inspiration du Projet

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.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages