Differences

This shows you the differences between two versions of the page.

Link to this comparison view

sde2:laboratoare:02_rust [2023/03/11 21:10]
cristiana.andrei [TP 03 - Systems de fichiers et le type Result]
sde2:laboratoare:02_rust [2023/03/14 08:07] (current)
cristiana.andrei [Exercises]
Line 1: Line 1:
 ====== TP 02 - Systems de fichiers et le type Result ====== ====== TP 02 - Systems de fichiers et le type Result ======
 +===== Assignment ===== 
 +<note warning>​ 
 +Vous devez **accepter** le assignment d'ici et travailler avec ce repository: [[https://​classroom.github.com/​a/​sNXCQSO0|Lab2]] 
 +</​note>​
 ===== Objectifs ===== ===== Objectifs =====
 Le but de ce TP est d'​apprendre à utiliser ​ Le but de ce TP est d'​apprendre à utiliser ​
Line 72: Line 75:
 Pour consulter toutes les méthodes disponibles,​ veuillez lire la documentation suivante: [[https://​doc.rust-lang.org/​stable/​std/​fs/​struct.Metadata.html|Metadata crate]]! Pour consulter toutes les méthodes disponibles,​ veuillez lire la documentation suivante: [[https://​doc.rust-lang.org/​stable/​std/​fs/​struct.Metadata.html|Metadata crate]]!
 </​note>​ </​note>​
 +
 +=== Le descripteur de fichier ===
 +Un **descripteur de fichier** est un numéro qui identifie de manière unique un fichier ouvert dans le système d'​exploitation d'un ordinateur. Il décrit une ressource de données et comment cette ressource peut être accessible.
 +
 +Lorsqu'​un programme demande d'​ouvrir un fichier **le kernel** fait les actions suivantes:
 +  - Accorde l'​accès
 +  - Crée une entrée dans la table de fichiers globale
 +  - Fournit au logiciel l'​emplacement de cette entrée
 +
 +Le descripteur est identifié par un **entier non négatif unique**, tel que 0, 12 ou 567. Au moins un descripteur de fichier existe pour chaque fichier ouvert sur le système.
 +
 +Pour obtenir le //file descriptor//​ d'un fichier on utilise la fonction [[https://​doc.rust-lang.org/​stable/​std/​os/​fd/​trait.AsRawFd.html#​tymethod.as_raw_fd|as_raw_fd()]].
  
 ===== Le type Result ===== ===== Le type Result =====
Line 90: Line 105:
 Étant donné que Result a ces paramètres de type génériques,​ nous pouvons utiliser le type Result et les fonctions qui y sont définies dans de nombreuses situations différentes où la valeur réussie et la valeur d'​erreur que nous voulons renvoyer peuvent différer. Étant donné que Result a ces paramètres de type génériques,​ nous pouvons utiliser le type Result et les fonctions qui y sont définies dans de nombreuses situations différentes où la valeur réussie et la valeur d'​erreur que nous voulons renvoyer peuvent différer.
  
 +Voila ici un example d'​utilisation de Result pour ouvrir un fichier:
 +<code c>
 +use std::​fs::​File;​
 +
 +fn main() {
 +    let greeting_file_result = File::​open("​hello.txt"​);​
 +
 +    let greeting_file = match greeting_file_result {
 +        Ok(file) => file,
 +        Err(error) => panic!("​Problem opening the file: {:?}", error),
 +    };
 +}
 +</​code>​
 +
 +=== Raccourcis: unwrap ===
 +La méthode **unwrap** est une méthode raccourcie implémentée tout comme l'​expression de correspondance que nous avons écrite ci-dessus.
 +Si la valeur Result est la variante Ok, unwrap renverra la valeur à l'​intérieur de Ok. Si le résultat est la variante Err, unwrap appellera la panic! macro pour nous. Voici un exemple de déballage en action :
 +
 +<code c>
 +use std::​fs::​File;​
 +
 +fn main() {
 +    let greeting_file = File::​open("​hello.txt"​).unwrap();​
 +}
 +</​code>​
 +
 +De même, la méthode **expect** nous permet également de choisir la panic! Message d'​erreur. Utiliser expect au lieu de déballer et fournir de bons messages d'​erreur peut transmettre votre intention et faciliter la recherche de la source d'une panique. La syntaxe de expect ressemble à ceci :
 +
 +<code c>
 +use std::​fs::​File;​
 +
 +fn main() {
 +    let greeting_file = File::​open("​hello.txt"​)
 +        .expect("​hello.txt should be included in this project"​);​
 +}
 +</​code>​
 +
 +=== L'​operateur '?'​ ===
 +Le **?** placé après la définition d'une valeur de résultat pour fonctionner presque de la même manière que l'​expression de //match// que nous avons définies pour gérer les valeurs de résultat dans l'​exemple pour unwrap.
 +
 +Si la valeur du résultat est un Ok, la valeur à l'​intérieur de l'Ok sera renvoyée à partir de cette expression et le programme continuera. Si la valeur est une Err, l'Err sera renvoyée par toute la fonction comme si nous avions utilisé le mot-clé return afin que la valeur d'​erreur soit propagée au code appelant.
 +
 +<code c>
 +use std::​fs::​File;​
 +use std::​io::​{self,​ Read};
 +
 +fn read_username_from_file() -> Result<​String,​ io::​Error>​ {
 +    let mut username = String::​new();​
 +
 +    File::​open("​hello.txt"​)?​.read_to_string(&​mut username)?;
 +
 +    Ok(username)
 +}
 +</​code>​
 +
 +
 +Dans le contexte ci-dessous, le ? à la fin de l'​appel File::open renverra la valeur à l'​intérieur d'un Ok à la variable username_file. Si une erreur se produit, le ? L'​opérateur reviendra plus tôt de toute la fonction et donnera n'​importe quelle valeur Err au code appelant. La même chose s'​applique au ? à la fin de l'​appel read_to_string.
  
 ===== Sugestions ===== ===== Sugestions =====
Line 128: Line 200:
   * Linux permissions [[https://​en.wikipedia.org/​wiki/​Chmod]]   * Linux permissions [[https://​en.wikipedia.org/​wiki/​Chmod]]
  
-===== Sujets ​===== +===== Exercises ​===== 
-  - Écrivez un programme qui reçoit en paramètre un dossier. Imprimer le contenu du dossier. ​+  - Écrivez un programme qui reçoit en paramètre un dossier. Imprimer le contenu du dossier. ​//Hint: [[https://​doc.rust-lang.org/​std/​fs/​fn.read_dir.html|read_dir]]//​
   - Écrivez un programme qui reçoit en argument de ligne de commande un fichier et une tâche. Mettre en œuvre les tâches :    - Écrivez un programme qui reçoit en argument de ligne de commande un fichier et une tâche. Mettre en œuvre les tâches : 
-    - **print** - imprime le contenu du fichier  ​+    - **print** - imprime le contenu du fichier ​et le file descriptor ​ 
     - **size** - imprime la taille du fichier  ​     - **size** - imprime la taille du fichier  ​
     - **owner** - affiche l'​utilisateur (uid) et le groupe (gid) du fichier ​     - **owner** - affiche l'​utilisateur (uid) et le groupe (gid) du fichier ​
Line 138: Line 210:
     - **mode_text** - affiche le mode (permissions) en text (rwx...) du fichier ​     - **mode_text** - affiche le mode (permissions) en text (rwx...) du fichier ​
     - **print_buffer** - imprimez le contenu du fichier à l'aide des fonctions open et read.      - **print_buffer** - imprimez le contenu du fichier à l'aide des fonctions open et read. 
-  ​+<​hidden>​
 ===== Solutions ===== ===== Solutions =====
 [[https://​github.com/​UPB-FILS-SdE2/​Solutions/​tree/​main/​tp3|Solutions]] [[https://​github.com/​UPB-FILS-SdE2/​Solutions/​tree/​main/​tp3|Solutions]]
 +</​hidden>​
sde2/laboratoare/02_rust.1678561800.txt.gz · Last modified: 2023/03/11 21:10 by cristiana.andrei
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0