Bonjour à tous. Dans cette séquence nous allons voir l'API
qui permet de manipuler les fichiers.
Donc ce que nous allons étudier plus en particulier c'est
comment naviguer entre les dossiers, comment créer et
supprimer des dossiers, comment lister les fichiers d'un
dossier et, comment lire et écrire depuis et
vers des fichiers.
Alors pour commencer il faut un point d'entrée dans le
système de fichiers, il y en a plusieurs, donc avec
FileLocator home vous avez le dossier de l'utilisateur,.
FileLocator root vous avez la racine
du système de fichier et avec FileLocator C sous
Windows vous avez le disque C 2 points.
Une fois que vous avez un dossier, donc ces 3 éléments-là
sont des dossiers, là j'en prends un, FileLocator home,
donc j'ai la home directory d'un des utilisateurs.
À partir de là je peux demander donne-moi ton chemin d'accès.
Donc home ce n'est pas une chaîne de caractères c'est un
objet qui représente un dossier et je peux lui demander
donne-moi la chaîne de caractères qui montre où tu te
trouves dans le système. Donc là c'est / home / Cassou.
À un dossier je peux y demander quels sont tous tes
enfants, c'est-à-dire quels sont tous les fichiers et les
dossiers que tu contiens. Donc là il me dit dans Home
j'ai un fichier point bashrc et j'ai un dossier Music.
Donc ça children, retourne un ensemble d'objets,
qui sont des fichiers ou des dossiers.
Si on joue un petit peu encore avec cet API-là, on peut
remarquer la méthode /, quand on voit le message /
à un dossier on va pouvoir indiquer un enfant en
particulier qui nous intéresse.
Donc home / Music me donne le dossier music.
En envoyant le message "directories" à un dossier, j'obtiens
tous les sous-dossiers.
Donc là je vois que dans ma bibliothèque de musiques j'ai
un dossier Anouar Brahem.
Le message "parent" me permet de remonter d'un cran.
Donc si je suis dans le dossier musique, j'envoie
"parent" bah je reviens dans mon dossier home.
En partant de mon dossier musique comme vu précédemment,
je vais essayer de créer un dossier.
Donc pour cela je peux déjà vérifier est-ce que le dossier existe.
En envoyant un message "isDirectory" à un dossier j'obtiens
vrai ou faux suivant qu'il existe ou pas.
Donc là ça me dit, le dossier n'existe pas, très bien,
avec "ensureCreateDirectory" je le crée.
Puis je teste, est-ce que tu existes?
Dans ce cas-là il existe.
Avec delete, je peux l'effacer et je vérifie qu'il est
bien effacé en envoyant isDirectory.
Pour trouver tous les fils d'un dossier il y a plusieurs
possibilités, donc là j'en montre 2.
En envoyant le message "allChidrenMatching" à un dossier
et en lui passant une expression qui est
typique d'échelle et, qui représente
le nom du fichier auquel on s'attend, donc avec * point
ogg, je veux tous les fichiers dont l'extension est "ogg".
Donc ça ça me retourner tous mes fichiers musiques ogg
dans mon dossier Pink Floyd.
Je peux faire la même chose un petit peu plus verbeux.
En envoyant le message "allChildren" je récupère tous les
enfants, tous les fichiers et tous les dossiers, d'un
dossier en particulier et, je filtre avec le message
"select", tous ceux dont le nom se termine par "ogg".
Donc "basename" retourne la chaîne de caractères qui
représente le nom du fichier et, je veux que le nom du
fichier se termine par "ogg".
Ces 2 bootcuts sont à peu près équivalents.
Alors comment est-ce qu'on peut récupérer de l'information sur un fichier?
Donc d'abord comment créer un fichier à partir d'une chaîne de caractères?
Là j'ai un nom de fichier " asFileReference", ça me
transforme le nom de fichier en une référence vers un fichier.
Ça peut être une référence vers un fichier qui existe ou
une référence vers une fichier qui n'existe pas, pour le
moment je ne sais pas. En envoyant le message "isFile" à
cette référence j'obtiens "vrai", si c'est un fichier qui
existe, et "faux", si c'est un fichier qui n'existe pas.
En envoyant le message "basename", j'obtiens le nom du fichier.
En envoyant "extension", j'obtiens l'extension du fichier.
Avec "size", j'obtiens la taille et "pathString",
comme on l'a vu précédemment, j'obtiens le chemin d'accès
sous la forme d'une chaîne de caractères.
Maintenant voyons comment on peut écrire et lire dans un fichier.
Alors pour écrire, d'abord je récupère une référence vers
un fichier, ici je vérifie qu'il n'existe pas.
Donc on peut écrire dans un fichier qui existe mais là je
vérifie qu'il n'existe pas.
J'écris dedans, donc pour écrire je créé un stream
avec "nextPutAll" je demande d'écrire chaque caractère de
la chaîne de caractères dans le fichier et, à la fin je
ferme mon flux pour m'assurer que le système d'exploitation
a bien tout écrit sur le disque.
À l'inverse je peux lire depuis un fichier, donc je
reprends le même fichier et le point txt, je vérifie qu'il
existe, là il existe puisqu'on vient d'écrire faire quelque chose dedans.
Je crée un flux en lecture, donc un "reasdStream" et je
vais regarder, donc soit caractère par caractère en
envoyant le message "next", donc avec le message "next je
veux d'abord obtenir H puis E puis L, puis L et caetera.
Donc là je fais "next" une seule fois, j'obtiens H et
après je vais récupérer tout depuis le premier H que je
viens de lire jusqu'à la fin du fichier, donc là j'obtiens
"ello World" mais sans le H.
À la fin j'envoie le message "close" à l'objet "stream"
pour m'assurer que la référence du fichier est bien fermée.
On peut écrire ces codes-là plus simplement en
n'ayant plus besoin non plus d'envoyer le message "close".
Parce qu'envoyer le message "close" on peut oublier de le
faire et, il peut y avoir une exception qui fait qu'au
final le "close" n'est jamais envoyé.
Donc en général on essaye de ne pas avoir à l'écrire soi-même.
Donc pour ça, pour écrire, je prends ma référence de
fichier, j'envoie le message "readStreamDo", qui prend un
bloc en paramètres, le Bloc prend un stream en paramètre.
Donc ce stream-là il sera fourni automatiquement par la
méthode "writeStreamDo", qui va créer le stream, qui va
créer un "writestream" sur le fichier.
Moi la seule chose que j'ai besoin de faire, c'est à
partir de ce stream, je manipule le stream pour faire ce
que je veux avec le fichier. Donc là je vais écrire
"Hello World" dans le fichier, je fais "streamnextall" "Hello World".
Quand le bloc se termine le flux est fermé
automatiquement et le fichier s'écrit sur le disque.
Pour la lecture, c'est exactement le même principe je
remplace "writeStreamDo" par e"readStreamDo".
Ici j'ai un stream, j'en fais ce que j'en veux et là ce
que je décide c'est de récupérer l'ensemble du contenu du stream.
Alors ce que vous devez retenir, c'est que les fichiers
et les dossiers sont des références, sont des objets qui
sont des références vers des fichiers et des dossiers sur
le disque, qui peuvent ou pas exister.
Donc on peut demander avec "exist", avec "isFile", avec
"isDirectory" si les fichiers et dossiers existent sur le disque.
L'API est simple et permet une navigation simplifiée et
une manipulation des dossiers et des fichiers simplifiée.
On peut lire et écrire des fichiers grâce au stream et,
avec une API qui va imposer
automatiquement un "close" à la fin de l'utilisation du stream.