1 00:00:00,580 --> 00:00:04,120 Bonjour à tous. Dans cette séquence nous allons voir l'API 2 00:00:04,320 --> 00:00:05,780 qui permet de manipuler les fichiers. 3 00:00:06,780 --> 00:00:09,430 Donc ce que nous allons étudier plus en particulier c'est 4 00:00:09,630 --> 00:00:14,110 comment naviguer entre les dossiers, comment créer et 5 00:00:14,310 --> 00:00:18,570 supprimer des dossiers, comment lister les fichiers d'un 6 00:00:18,770 --> 00:00:22,470 dossier et, comment lire et écrire depuis et 7 00:00:23,180 --> 00:00:23,940 vers des fichiers. 8 00:00:24,430 --> 00:00:27,280 Alors pour commencer il faut un point d'entrée dans le 9 00:00:27,490 --> 00:00:31,130 système de fichiers, il y en a plusieurs, donc avec 10 00:00:31,330 --> 00:00:34,700 FileLocator home vous avez le dossier de l'utilisateur,. 11 00:00:35,810 --> 00:00:39,000 FileLocator root vous avez la racine 12 00:00:40,460 --> 00:00:44,390 du système de fichier et avec FileLocator C sous 13 00:00:45,000 --> 00:00:46,790 Windows vous avez le disque C 2 points. 14 00:00:47,620 --> 00:00:51,690 Une fois que vous avez un dossier, donc ces 3 éléments-là 15 00:00:51,890 --> 00:00:54,940 sont des dossiers, là j'en prends un, FileLocator home, 16 00:00:55,730 --> 00:00:59,810 donc j'ai la home directory d'un des utilisateurs. 17 00:01:01,370 --> 00:01:05,940 À partir de là je peux demander donne-moi ton chemin d'accès. 18 00:01:06,250 --> 00:01:08,820 Donc home ce n'est pas une chaîne de caractères c'est un 19 00:01:09,020 --> 00:01:13,140 objet qui représente un dossier et je peux lui demander 20 00:01:13,340 --> 00:01:16,040 donne-moi la chaîne de caractères qui montre où tu te 21 00:01:16,240 --> 00:01:19,360 trouves dans le système. Donc là c'est / home / Cassou. 22 00:01:21,050 --> 00:01:23,610 À un dossier je peux y demander quels sont tous tes 23 00:01:23,810 --> 00:01:26,070 enfants, c'est-à-dire quels sont tous les fichiers et les 24 00:01:26,270 --> 00:01:30,890 dossiers que tu contiens. Donc là il me dit dans Home 25 00:01:31,160 --> 00:01:35,670 j'ai un fichier point bashrc et j'ai un dossier Music. 26 00:01:37,080 --> 00:01:41,160 Donc ça children, retourne un ensemble d'objets, 27 00:01:41,890 --> 00:01:44,510 qui sont des fichiers ou des dossiers. 28 00:01:45,910 --> 00:01:50,310 Si on joue un petit peu encore avec cet API-là, on peut 29 00:01:50,510 --> 00:01:54,830 remarquer la méthode /, quand on voit le message / 30 00:01:55,880 --> 00:01:59,560 à un dossier on va pouvoir indiquer un enfant en 31 00:01:59,760 --> 00:02:01,430 particulier qui nous intéresse. 32 00:02:02,430 --> 00:02:06,700 Donc home / Music me donne le dossier music. 33 00:02:08,160 --> 00:02:12,450 En envoyant le message "directories" à un dossier, j'obtiens 34 00:02:12,790 --> 00:02:13,550 tous les sous-dossiers. 35 00:02:14,730 --> 00:02:18,560 Donc là je vois que dans ma bibliothèque de musiques j'ai 36 00:02:18,760 --> 00:02:19,560 un dossier Anouar Brahem. 37 00:02:22,170 --> 00:02:24,830 Le message "parent" me permet de remonter d'un cran. 38 00:02:25,640 --> 00:02:28,810 Donc si je suis dans le dossier musique, j'envoie 39 00:02:29,010 --> 00:02:31,080 "parent" bah je reviens dans mon dossier home. 40 00:02:32,270 --> 00:02:36,000 En partant de mon dossier musique comme vu précédemment, 41 00:02:36,250 --> 00:02:38,350 je vais essayer de créer un dossier. 42 00:02:39,640 --> 00:02:43,230 Donc pour cela je peux déjà vérifier est-ce que le dossier existe. 43 00:02:43,430 --> 00:02:47,070 En envoyant un message "isDirectory" à un dossier j'obtiens 44 00:02:47,270 --> 00:02:48,320 vrai ou faux suivant qu'il existe ou pas. 45 00:02:48,700 --> 00:02:51,670 Donc là ça me dit, le dossier n'existe pas, très bien, 46 00:02:51,870 --> 00:02:54,180 avec "ensureCreateDirectory" je le crée. 47 00:02:55,320 --> 00:02:57,390 Puis je teste, est-ce que tu existes? 48 00:02:57,820 --> 00:02:59,000 Dans ce cas-là il existe. 49 00:03:00,080 --> 00:03:03,040 Avec delete, je peux l'effacer et je vérifie qu'il est 50 00:03:03,240 --> 00:03:04,920 bien effacé en envoyant isDirectory. 51 00:03:06,310 --> 00:03:11,210 Pour trouver tous les fils d'un dossier il y a plusieurs 52 00:03:11,410 --> 00:03:12,890 possibilités, donc là j'en montre 2. 53 00:03:13,090 --> 00:03:17,200 En envoyant le message "allChidrenMatching" à un dossier 54 00:03:17,550 --> 00:03:21,670 et en lui passant une expression qui est 55 00:03:21,870 --> 00:03:24,710 typique d'échelle et, qui représente 56 00:03:26,770 --> 00:03:29,940 le nom du fichier auquel on s'attend, donc avec * point 57 00:03:30,140 --> 00:03:32,670 ogg, je veux tous les fichiers dont l'extension est "ogg". 58 00:03:35,000 --> 00:03:37,340 Donc ça ça me retourner tous mes fichiers musiques ogg 59 00:03:37,920 --> 00:03:38,680 dans mon dossier Pink Floyd. 60 00:03:40,640 --> 00:03:43,390 Je peux faire la même chose un petit peu plus verbeux. 61 00:03:43,910 --> 00:03:46,000 En envoyant le message "allChildren" je récupère tous les 62 00:03:46,200 --> 00:03:49,630 enfants, tous les fichiers et tous les dossiers, d'un 63 00:03:49,830 --> 00:03:53,910 dossier en particulier et, je filtre avec le message 64 00:03:54,110 --> 00:03:57,760 "select", tous ceux dont le nom se termine par "ogg". 65 00:03:58,150 --> 00:04:00,290 Donc "basename" retourne la chaîne de caractères qui 66 00:04:00,490 --> 00:04:03,820 représente le nom du fichier et, je veux que le nom du 67 00:04:04,020 --> 00:04:05,320 fichier se termine par "ogg". 68 00:04:05,520 --> 00:04:07,830 Ces 2 bootcuts sont à peu près équivalents. 69 00:04:08,780 --> 00:04:11,900 Alors comment est-ce qu'on peut récupérer de l'information sur un fichier? 70 00:04:12,800 --> 00:04:16,610 Donc d'abord comment créer un fichier à partir d'une chaîne de caractères? 71 00:04:16,810 --> 00:04:20,810 Là j'ai un nom de fichier " asFileReference", ça me 72 00:04:21,010 --> 00:04:23,760 transforme le nom de fichier en une référence vers un fichier. 73 00:04:24,270 --> 00:04:26,100 Ça peut être une référence vers un fichier qui existe ou 74 00:04:26,300 --> 00:04:27,700 une référence vers une fichier qui n'existe pas, pour le 75 00:04:27,900 --> 00:04:31,750 moment je ne sais pas. En envoyant le message "isFile" à 76 00:04:31,950 --> 00:04:34,520 cette référence j'obtiens "vrai", si c'est un fichier qui 77 00:04:34,720 --> 00:04:36,170 existe, et "faux", si c'est un fichier qui n'existe pas. 78 00:04:37,620 --> 00:04:40,680 En envoyant le message "basename", j'obtiens le nom du fichier. 79 00:04:42,000 --> 00:04:44,340 En envoyant "extension", j'obtiens l'extension du fichier. 80 00:04:46,000 --> 00:04:50,250 Avec "size", j'obtiens la taille et "pathString", 81 00:04:51,010 --> 00:04:53,500 comme on l'a vu précédemment, j'obtiens le chemin d'accès 82 00:04:53,700 --> 00:04:54,840 sous la forme d'une chaîne de caractères. 83 00:04:56,020 --> 00:04:58,520 Maintenant voyons comment on peut écrire et lire dans un fichier. 84 00:04:58,720 --> 00:05:03,400 Alors pour écrire, d'abord je récupère une référence vers 85 00:05:03,600 --> 00:05:06,790 un fichier, ici je vérifie qu'il n'existe pas. 86 00:05:07,410 --> 00:05:09,730 Donc on peut écrire dans un fichier qui existe mais là je 87 00:05:09,930 --> 00:05:11,280 vérifie qu'il n'existe pas. 88 00:05:12,000 --> 00:05:16,300 J'écris dedans, donc pour écrire je créé un stream 89 00:05:17,470 --> 00:05:21,030 avec "nextPutAll" je demande d'écrire chaque caractère de 90 00:05:21,230 --> 00:05:24,100 la chaîne de caractères dans le fichier et, à la fin je 91 00:05:24,300 --> 00:05:26,570 ferme mon flux pour m'assurer que le système d'exploitation 92 00:05:26,770 --> 00:05:28,580 a bien tout écrit sur le disque. 93 00:05:29,270 --> 00:05:32,110 À l'inverse je peux lire depuis un fichier, donc je 94 00:05:32,310 --> 00:05:35,540 reprends le même fichier et le point txt, je vérifie qu'il 95 00:05:35,740 --> 00:05:38,210 existe, là il existe puisqu'on vient d'écrire faire quelque chose dedans. 96 00:05:39,630 --> 00:05:43,390 Je crée un flux en lecture, donc un "reasdStream" et je 97 00:05:43,590 --> 00:05:45,760 vais regarder, donc soit caractère par caractère en 98 00:05:45,960 --> 00:05:48,520 envoyant le message "next", donc avec le message "next je 99 00:05:48,720 --> 00:05:51,440 veux d'abord obtenir H puis E puis L, puis L et caetera. 100 00:05:51,740 --> 00:05:54,580 Donc là je fais "next" une seule fois, j'obtiens H et 101 00:05:54,780 --> 00:05:57,660 après je vais récupérer tout depuis le premier H que je 102 00:05:57,860 --> 00:06:00,200 viens de lire jusqu'à la fin du fichier, donc là j'obtiens 103 00:06:00,400 --> 00:06:02,180 "ello World" mais sans le H. 104 00:06:02,380 --> 00:06:04,780 À la fin j'envoie le message "close" à l'objet "stream" 105 00:06:05,590 --> 00:06:08,000 pour m'assurer que la référence du fichier est bien fermée. 106 00:06:09,270 --> 00:06:13,450 On peut écrire ces codes-là plus simplement en 107 00:06:14,130 --> 00:06:18,390 n'ayant plus besoin non plus d'envoyer le message "close". 108 00:06:19,000 --> 00:06:21,270 Parce qu'envoyer le message "close" on peut oublier de le 109 00:06:21,470 --> 00:06:24,500 faire et, il peut y avoir une exception qui fait qu'au 110 00:06:24,700 --> 00:06:26,060 final le "close" n'est jamais envoyé. 111 00:06:26,480 --> 00:06:29,370 Donc en général on essaye de ne pas avoir à l'écrire soi-même. 112 00:06:31,010 --> 00:06:35,830 Donc pour ça, pour écrire, je prends ma référence de 113 00:06:36,030 --> 00:06:40,400 fichier, j'envoie le message "readStreamDo", qui prend un 114 00:06:40,600 --> 00:06:45,250 bloc en paramètres, le Bloc prend un stream en paramètre. 115 00:06:45,670 --> 00:06:48,110 Donc ce stream-là il sera fourni automatiquement par la 116 00:06:48,310 --> 00:06:50,740 méthode "writeStreamDo", qui va créer le stream, qui va 117 00:06:50,940 --> 00:06:53,500 créer un "writestream" sur le fichier. 118 00:06:54,260 --> 00:06:55,880 Moi la seule chose que j'ai besoin de faire, c'est à 119 00:06:56,080 --> 00:06:58,750 partir de ce stream, je manipule le stream pour faire ce 120 00:06:58,950 --> 00:07:01,000 que je veux avec le fichier. Donc là je vais écrire 121 00:07:01,200 --> 00:07:03,490 "Hello World" dans le fichier, je fais "streamnextall" "Hello World". 122 00:07:04,810 --> 00:07:07,040 Quand le bloc se termine le flux est fermé 123 00:07:07,240 --> 00:07:09,650 automatiquement et le fichier s'écrit sur le disque. 124 00:07:11,230 --> 00:07:13,050 Pour la lecture, c'est exactement le même principe je 125 00:07:13,250 --> 00:07:14,560 remplace "writeStreamDo" par e"readStreamDo". 126 00:07:16,300 --> 00:07:19,030 Ici j'ai un stream, j'en fais ce que j'en veux et là ce 127 00:07:19,230 --> 00:07:22,020 que je décide c'est de récupérer l'ensemble du contenu du stream. 128 00:07:24,190 --> 00:07:27,400 Alors ce que vous devez retenir, c'est que les fichiers 129 00:07:27,600 --> 00:07:31,760 et les dossiers sont des références, sont des objets qui 130 00:07:31,960 --> 00:07:33,950 sont des références vers des fichiers et des dossiers sur 131 00:07:34,150 --> 00:07:35,710 le disque, qui peuvent ou pas exister. 132 00:07:35,910 --> 00:07:38,010 Donc on peut demander avec "exist", avec "isFile", avec 133 00:07:38,210 --> 00:07:40,840 "isDirectory" si les fichiers et dossiers existent sur le disque. 134 00:07:42,000 --> 00:07:45,700 L'API est simple et permet une navigation simplifiée et 135 00:07:45,900 --> 00:07:48,000 une manipulation des dossiers et des fichiers simplifiée. 136 00:07:49,150 --> 00:07:53,600 On peut lire et écrire des fichiers grâce au stream et, 137 00:07:54,840 --> 00:07:58,660 avec une API qui va imposer 138 00:07:58,860 --> 00:08:02,000 automatiquement un "close" à la fin de l'utilisation du stream.