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.

