﻿1
00:00:00,480 --> 00:00:01,440
みなさん、こんにちは。

2
00:00:01,600 --> 00:00:06,240
この講義では
ファイル操作のAPIを見ていきます。

3
00:00:06,680 --> 00:00:09,280
特に

4
00:00:09,480 --> 00:00:12,760
ファイル間のナビゲーション

5
00:00:12,920 --> 00:00:15,640
ファイルの生成と削除

6
00:00:16,520 --> 00:00:19,400
ディレクトリ内のファイルのリスト

7
00:00:20,280 --> 00:00:24,120
ファイルへの読み書きを見ていきます。

8
00:00:24,320 --> 00:00:25,720
最初に

9
00:00:25,920 --> 00:00:28,240
ファイルシステムへの入り口が必要です。

10
00:00:28,400 --> 00:00:30,440
入り口はたくさんあります。

11
00:00:30,600 --> 00:00:34,840
FileLocator home
でユーザーディレクトリが得られます。

12
00:00:35,560 --> 00:00:38,880
FileLocator root
でファイルシステムの

13
00:00:39,040 --> 00:00:42,840
ルートが得られます。

14
00:00:43,000 --> 00:00:47,120
FileLocator C
で Windows での C ドライブが得られます。


15
00:00:47,480 --> 00:00:50,160
これらの 3 つはどれもディレクトリです。

16
00:00:50,440 --> 00:00:53,120
ディレクトリが得られれば

17
00:00:53,280 --> 00:00:56,680
例えば FileLocator home で

18
00:00:56,840 --> 00:01:00,040
ユーザーのホームディレクトリが
得られれば

19
00:01:01,240 --> 00:01:03,160
そこから

20
00:01:03,920 --> 00:01:06,000
「アクセスパスをください」
と言うことができます。

21
00:01:06,160 --> 00:01:10,480
つまり home は文字列ではなく
ディレクトリを表現した

22
00:01:10,640 --> 00:01:12,960
オブジェクトで
「ファイルシステム中であなたを

23
00:01:13,120 --> 00:01:17,600
指定する文字列をください」と
お願いすることができます。

24
00:01:17,800 --> 00:01:20,120
この場合、 /home/cassou です。

25
00:01:21,000 --> 00:01:23,800
ディレクトリに
その子要素を訊くことができます。

26
00:01:23,960 --> 00:01:27,880
「あなたが持っている全ての
ファイルとディレクトリは？」と。

27
00:01:28,040 --> 00:01:30,960
ここに home からの答えがあります。

28
00:01:31,120 --> 00:01:33,640
.bashrc という名前のファイルや

29
00:01:33,800 --> 00:01:36,040
Music ディレクトリです。

30
00:01:36,960 --> 00:01:39,080
この children は

31
00:01:39,240 --> 00:01:41,280
ファイルとディレクトリを表す

32
00:01:41,440 --> 00:01:45,080
オブジェクトの束を返します。

33
00:01:45,680 --> 00:01:49,080
この API をもう少し掘り下げると

34
00:01:49,800 --> 00:01:53,160
/ メソッドがあります。

35
00:01:53,320 --> 00:01:55,000
/ メッセージをディレクトリへ送ると

36
00:01:55,840 --> 00:02:01,400
その特定の子要素を示すことができます。

37
00:02:02,320 --> 00:02:06,800
home / 'Music' で
Music ディレクトリが得られます。

38
00:02:08,080 --> 00:02:11,880
directories メッセージを
ディレクトリに送ると

39
00:02:12,040 --> 00:02:14,480
全てのサブディレクトリが得られます。

40
00:02:14,640 --> 00:02:18,080
ここに見える通り
私の Music ライブラリには

41
00:02:18,240 --> 00:02:20,400
Anouar_Brahem があります。

42
00:02:22,080 --> 00:02:25,360
parent メッセージで上の階層に
上がっていくことができます。

43
00:02:25,520 --> 00:02:28,320
Music ディレクトリに parent を送ると

44
00:02:28,480 --> 00:02:31,840
home ディレクトリが得られます。

45
00:02:32,160 --> 00:02:34,120
Music ディレクトリから離れて

46
00:02:34,400 --> 00:02:38,440
ディレクトリを作りたいと思います。

47
00:02:39,520 --> 00:02:43,000
まずディレクトリが存在するかどうか
確認するために

48
00:02:43,160 --> 00:02:46,400
isDirectory メッセージを送ります。

49
00:02:46,560 --> 00:02:48,480
するとディレクトリが存在するかどうか
が得られます。

50
00:02:48,640 --> 00:02:51,000
存在しないようです。

51
00:02:51,160 --> 00:02:54,560
では ensureCreateDirectory で
作ります。

52
00:02:55,320 --> 00:02:59,840
そして存在するかどうか確認すると
今回は存在します。

53
00:03:00,000 --> 00:03:03,520
delete で削除できます。
そして削除できたか確認するために

54
00:03:03,680 --> 00:03:05,360
isDirectory を送ります。

55
00:03:06,200 --> 00:03:07,280
ディレクトリ中の子要素を

56
00:03:07,480 --> 00:03:10,120
探すためには

57
00:03:10,280 --> 00:03:14,280
いくつかの方法があります。
そのうち 2 つをお見せします。

58
00:03:14,440 --> 00:03:17,320
allChildrenMatching: メッセージを
ディレクトリに送って

59
00:03:17,480 --> 00:03:21,120
表現式を渡します。

60
00:03:21,280 --> 00:03:25,120
表現式は

61
00:03:26,720 --> 00:03:30,640
期待する子要素の名前を示します。
この場合、*.ogg です。

62
00:03:30,800 --> 00:03:33,520
拡張子 .ogg を持つ全てのファイルを
求めています。

63
00:03:34,840 --> 00:03:39,280
すると PinkFloyd ディレクトリの
.ogg の音楽ファイルが得られます。

64
00:03:40,520 --> 00:03:43,680
同じことを長いコードでもできます。

65
00:03:43,840 --> 00:03:46,640
allChildren メッセージを送って

66
00:03:46,800 --> 00:03:50,960
特定のディレクトリの
全てのファイルやディレクトリを得て

67
00:03:51,800 --> 00:03:54,680
select: メッセージでフィルタします。

68
00:03:54,840 --> 00:03:57,880
basename でファイル名の文字列が
得られ

69
00:03:58,040 --> 00:04:02,080
名前が ogg で終わるものを

70
00:04:02,240 --> 00:04:05,360
選びます。

71
00:04:05,560 --> 00:04:08,080
この 2 つのコードはほとんど同じです。

72
00:04:08,680 --> 00:04:12,520
ファイルについての情報を
どうやって得るのか

73
00:04:12,680 --> 00:04:16,280
文字列からファイルをどうやって作るのか

74
00:04:16,440 --> 00:04:20,040
ファイル名があるので
asFileReference で

75
00:04:20,200 --> 00:04:24,000
ファイル名からファイルへの参照を得ます。

76
00:04:24,160 --> 00:04:29,000
そのファイルは存在しているかもしれないし
まだ存在していないかもしれません。

77
00:04:29,160 --> 00:04:32,760
参照に isFile メッセージを送ると

78
00:04:32,920 --> 00:04:36,600
参照先のファイルが存在すれば true
存在しなければ false になります。

79
00:04:37,560 --> 00:04:41,720
basename メッセージを送ると
そのファイルの名前が得られます。

80
00:04:41,880 --> 00:04:45,080
extension を送ると
ファイルの拡張子が得られます。

81
00:04:45,920 --> 00:04:48,720
size でファイルサイズが得られます。

82
00:04:49,640 --> 00:04:52,000
pathString は先程も使いましたが

83
00:04:52,160 --> 00:04:55,160
ファイルへのパスを文字列形式で得られます。

84
00:04:55,920 --> 00:04:59,680
さて、ではファイルへの読み書きを
見てみましょう。書き込みですが

85
00:05:00,160 --> 00:05:04,240
まず最初にファイルへの参照を作ります。

86
00:05:05,160 --> 00:05:07,160
ここで、参照先が存在しないことを確認します。

87
00:05:07,320 --> 00:05:11,720
ファイルは存在していません。

88
00:05:11,880 --> 00:05:16,400
書き込むためには
ストリームを作成します。

89
00:05:17,360 --> 00:05:18,920
nextPutAll: で

90
00:05:19,080 --> 00:05:22,520
文字列中の各文字をファイルに書き込みます。

91
00:05:23,480 --> 00:05:26,680
最後にストリームを閉じて、確実に

92
00:05:26,840 --> 00:05:28,720
システムに全てを書き込みを完了させます。

93
00:05:29,200 --> 00:05:30,640
反対に、ファイルから読み込むためには

94
00:05:30,840 --> 00:05:34,680
.txt ファイルについて

95
00:05:34,840 --> 00:05:38,400
存在するか確認します。もちろん存在します。
さきほど書き込んだので。

96
00:05:39,560 --> 00:05:42,920
readStream で
読み込み用のストリームを作成します。

97
00:05:43,080 --> 00:05:46,880
next を送って文字を見ていきます。

98
00:05:47,040 --> 00:05:51,480
next メッセージで
h、e、l、…を得ていきます。

99
00:05:51,640 --> 00:05:54,240
最初の next で h が得られ

100
00:05:54,400 --> 00:05:56,120
続いて、残り全てを取り出します。

101
00:05:56,280 --> 00:05:59,200
h を読んでからファイルの最後までを
読み込みました。

102
00:05:59,360 --> 00:06:01,840
これで 最初の「h」を除いた
「ello World」が得られます。

103
00:06:02,000 --> 00:06:05,120
最後にストリームオブジェクトに
close を送って
to the stream object,

104
00:06:05,280 --> 00:06:08,440
ファイルを確実に閉じます。

105
00:06:09,160 --> 00:06:12,440
close メッセージを使わずに

106
00:06:13,000 --> 00:06:16,400
もっと簡単なコードで

107
00:06:16,560 --> 00:06:18,720
書くことができます。

108
00:06:18,880 --> 00:06:22,240
close メッセージを送り忘れたり
することがあります。

109
00:06:22,400 --> 00:06:26,200
ファイルが閉じられていないために
例外が発生することもあります。

110
00:06:26,360 --> 00:06:30,720
一般的に、自分で close を書かずに
済ませたいところです。

111
00:06:30,880 --> 00:06:33,360
そのためには、書き込みでは

112
00:06:33,520 --> 00:06:36,640
ファイルへの参照へ

113
00:06:36,800 --> 00:06:39,520
writeStreamDo: メッセージを送ります。

114
00:06:39,680 --> 00:06:41,400
引数としてブロックを渡すと

115
00:06:41,560 --> 00:06:45,400
そのブロックが引数として
ストリームを受け取ります。

116
00:06:45,560 --> 00:06:49,280
このストリームは writeStreamDo: が

117
00:06:49,440 --> 00:06:54,040
そのファイルへの書き込み用ストリームとして
自動的に作って管理してくれます。

118
00:06:54,200 --> 00:06:56,840
私がこのストリームでしなければならないことは

119
00:06:57,000 --> 00:06:59,960
そのファイルでやりたいことをするために
ストリームを操作するだけです。

120
00:07:00,120 --> 00:07:04,560
「Hello World」をファイルに書き込むには
stream nextPutAll: 'Hello World' とします。

121
00:07:04,720 --> 00:07:06,080
ブロックが終了すると

122
00:07:06,240 --> 00:07:09,800
ストリームが自動的に閉じられて
ファイルがディスクに書き込まれます。

123
00:07:11,240 --> 00:07:15,040
読み込みでも readStreamDo: で
同じことができます。

124
00:07:16,200 --> 00:07:18,480
ここでストリームが得られて
好きなように操作します。

125
00:07:18,640 --> 00:07:23,000
ここでストリームの内容を受け取ります。

126
00:07:24,080 --> 00:07:25,920
今回学んだことをまとめます。

127
00:07:26,480 --> 00:07:30,120
ファイルやディレクトリは参照です。

128
00:07:30,320 --> 00:07:34,200
ディスク上のファイルやディレクトリ
への参照です。

129
00:07:34,360 --> 00:07:38,880
参照先は存在しているかもしれないし
存在していないかもしれません。

130
00:07:39,040 --> 00:07:41,560
isFile や isDirectory で
存在するかどうかを確認します。

131
00:07:41,720 --> 00:07:43,040
API はシンプルです。

132
00:07:43,200 --> 00:07:48,120
ファイルのナビゲーションや操作を
提供します。

133
00:07:49,040 --> 00:07:54,120
ファイルの読み書きを
ストリームを使って行います。

134
00:07:54,480 --> 00:07:57,480
最後にストリームを閉じることを

135
00:07:57,640 --> 00:08:02,320
自動的にやってくれる API があります。
