WEBVTT

00:00:00.480 --> 00:00:01.440 align:middle
みなさん、こんにちは。

00:00:01.600 --> 00:00:06.240 align:middle
この講義では
ファイル操作のAPIを見ていきます。

00:00:06.680 --> 00:00:09.280 align:middle
特に

00:00:09.480 --> 00:00:12.760 align:middle
ファイル間のナビゲーション

00:00:12.920 --> 00:00:15.640 align:middle
ファイルの生成と削除

00:00:16.520 --> 00:00:19.400 align:middle
ディレクトリ内のファイルのリスト

00:00:20.280 --> 00:00:24.120 align:middle
ファイルへの読み書きを見ていきます。

00:00:24.320 --> 00:00:25.720 align:middle
最初に

00:00:25.920 --> 00:00:28.240 align:middle
ファイルシステムへの入り口が必要です。

00:00:28.400 --> 00:00:30.440 align:middle
入り口はたくさんあります。

00:00:30.600 --> 00:00:34.840 align:middle
FileLocator home
でユーザーディレクトリが得られます。

00:00:35.560 --> 00:00:38.880 align:middle
FileLocator root
でファイルシステムの

00:00:39.040 --> 00:00:42.840 align:middle
ルートが得られます。

00:00:43.000 --> 00:00:47.120 align:middle
FileLocator C
で Windows での C ドライブが得られます。

15 align:middle
00:00:47,480 --> 00:00:50,160
これらの 3 つはどれもディレクトリです。

00:00:50.440 --> 00:00:53.120 align:middle
ディレクトリが得られれば

00:00:53.280 --> 00:00:56.680 align:middle
例えば FileLocator home で

00:00:56.840 --> 00:01:00.040 align:middle
ユーザーのホームディレクトリが
得られれば

00:01:01.240 --> 00:01:03.160 align:middle
そこから

00:01:03.920 --> 00:01:06.000 align:middle
「アクセスパスをください」
と言うことができます。

00:01:06.160 --> 00:01:10.480 align:middle
つまり home は文字列ではなく
ディレクトリを表現した

00:01:10.640 --> 00:01:12.960 align:middle
オブジェクトで
「ファイルシステム中であなたを

00:01:13.120 --> 00:01:17.600 align:middle
指定する文字列をください」と
お願いすることができます。

00:01:17.800 --> 00:01:20.120 align:middle
この場合、 /home/cassou です。

00:01:21.000 --> 00:01:23.800 align:middle
ディレクトリに
その子要素を訊くことができます。

00:01:23.960 --> 00:01:27.880 align:middle
「あなたが持っている全ての
ファイルとディレクトリは？」と。

00:01:28.040 --> 00:01:30.960 align:middle
ここに home からの答えがあります。

00:01:31.120 --> 00:01:33.640 align:middle
.bashrc という名前のファイルや

00:01:33.800 --> 00:01:36.040 align:middle
Music ディレクトリです。

00:01:36.960 --> 00:01:39.080 align:middle
この children は

00:01:39.240 --> 00:01:41.280 align:middle
ファイルとディレクトリを表す

00:01:41.440 --> 00:01:45.080 align:middle
オブジェクトの束を返します。

00:01:45.680 --> 00:01:49.080 align:middle
この API をもう少し掘り下げると

00:01:49.800 --> 00:01:53.160 align:middle
/ メソッドがあります。

00:01:53.320 --> 00:01:55.000 align:middle
/ メッセージをディレクトリへ送ると

00:01:55.840 --> 00:02:01.400 align:middle
その特定の子要素を示すことができます。

00:02:02.320 --> 00:02:06.800 align:middle
home / 'Music' で
Music ディレクトリが得られます。

00:02:08.080 --> 00:02:11.880 align:middle
directories メッセージを
ディレクトリに送ると

00:02:12.040 --> 00:02:14.480 align:middle
全てのサブディレクトリが得られます。

00:02:14.640 --> 00:02:18.080 align:middle
ここに見える通り
私の Music ライブラリには

00:02:18.240 --> 00:02:20.400 align:middle
Anouar_Brahem があります。

00:02:22.080 --> 00:02:25.360 align:middle
parent メッセージで上の階層に
上がっていくことができます。

00:02:25.520 --> 00:02:28.320 align:middle
Music ディレクトリに parent を送ると

00:02:28.480 --> 00:02:31.840 align:middle
home ディレクトリが得られます。

00:02:32.160 --> 00:02:34.120 align:middle
Music ディレクトリから離れて

00:02:34.400 --> 00:02:38.440 align:middle
ディレクトリを作りたいと思います。

00:02:39.520 --> 00:02:43.000 align:middle
まずディレクトリが存在するかどうか
確認するために

00:02:43.160 --> 00:02:46.400 align:middle
isDirectory メッセージを送ります。

00:02:46.560 --> 00:02:48.480 align:middle
するとディレクトリが存在するかどうか
が得られます。

00:02:48.640 --> 00:02:51.000 align:middle
存在しないようです。

00:02:51.160 --> 00:02:54.560 align:middle
では ensureCreateDirectory で
作ります。

00:02:55.320 --> 00:02:59.840 align:middle
そして存在するかどうか確認すると
今回は存在します。

00:03:00.000 --> 00:03:03.520 align:middle
delete で削除できます。
そして削除できたか確認するために

00:03:03.680 --> 00:03:05.360 align:middle
isDirectory を送ります。

00:03:06.200 --> 00:03:07.280 align:middle
ディレクトリ中の子要素を

00:03:07.480 --> 00:03:10.120 align:middle
探すためには

00:03:10.280 --> 00:03:14.280 align:middle
いくつかの方法があります。
そのうち 2 つをお見せします。

00:03:14.440 --> 00:03:17.320 align:middle
allChildrenMatching: メッセージを
ディレクトリに送って

00:03:17.480 --> 00:03:21.120 align:middle
表現式を渡します。

00:03:21.280 --> 00:03:25.120 align:middle
表現式は

00:03:26.720 --> 00:03:30.640 align:middle
期待する子要素の名前を示します。
この場合、*.ogg です。

00:03:30.800 --> 00:03:33.520 align:middle
拡張子 .ogg を持つ全てのファイルを
求めています。

00:03:34.840 --> 00:03:39.280 align:middle
すると PinkFloyd ディレクトリの
.ogg の音楽ファイルが得られます。

00:03:40.520 --> 00:03:43.680 align:middle
同じことを長いコードでもできます。

00:03:43.840 --> 00:03:46.640 align:middle
allChildren メッセージを送って

00:03:46.800 --> 00:03:50.960 align:middle
特定のディレクトリの
全てのファイルやディレクトリを得て

00:03:51.800 --> 00:03:54.680 align:middle
select: メッセージでフィルタします。

00:03:54.840 --> 00:03:57.880 align:middle
basename でファイル名の文字列が
得られ

00:03:58.040 --> 00:04:02.080 align:middle
名前が ogg で終わるものを

00:04:02.240 --> 00:04:05.360 align:middle
選びます。

00:04:05.560 --> 00:04:08.080 align:middle
この 2 つのコードはほとんど同じです。

00:04:08.680 --> 00:04:12.520 align:middle
ファイルについての情報を
どうやって得るのか

00:04:12.680 --> 00:04:16.280 align:middle
文字列からファイルをどうやって作るのか

00:04:16.440 --> 00:04:20.040 align:middle
ファイル名があるので
asFileReference で

00:04:20.200 --> 00:04:24.000 align:middle
ファイル名からファイルへの参照を得ます。

00:04:24.160 --> 00:04:29.000 align:middle
そのファイルは存在しているかもしれないし
まだ存在していないかもしれません。

00:04:29.160 --> 00:04:32.760 align:middle
参照に isFile メッセージを送ると

00:04:32.920 --> 00:04:36.600 align:middle
参照先のファイルが存在すれば true
存在しなければ false になります。

00:04:37.560 --> 00:04:41.720 align:middle
basename メッセージを送ると
そのファイルの名前が得られます。

00:04:41.880 --> 00:04:45.080 align:middle
extension を送ると
ファイルの拡張子が得られます。

00:04:45.920 --> 00:04:48.720 align:middle
size でファイルサイズが得られます。

00:04:49.640 --> 00:04:52.000 align:middle
pathString は先程も使いましたが

00:04:52.160 --> 00:04:55.160 align:middle
ファイルへのパスを文字列形式で得られます。

00:04:55.920 --> 00:04:59.680 align:middle
さて、ではファイルへの読み書きを
見てみましょう。書き込みですが

00:05:00.160 --> 00:05:04.240 align:middle
まず最初にファイルへの参照を作ります。

00:05:05.160 --> 00:05:07.160 align:middle
ここで、参照先が存在しないことを確認します。

00:05:07.320 --> 00:05:11.720 align:middle
ファイルは存在していません。

00:05:11.880 --> 00:05:16.400 align:middle
書き込むためには
ストリームを作成します。

00:05:17.360 --> 00:05:18.920 align:middle
nextPutAll: で

00:05:19.080 --> 00:05:22.520 align:middle
文字列中の各文字をファイルに書き込みます。

00:05:23.480 --> 00:05:26.680 align:middle
最後にストリームを閉じて、確実に

00:05:26.840 --> 00:05:28.720 align:middle
システムに全てを書き込みを完了させます。

00:05:29.200 --> 00:05:30.640 align:middle
反対に、ファイルから読み込むためには

00:05:30.840 --> 00:05:34.680 align:middle
.txt ファイルについて

00:05:34.840 --> 00:05:38.400 align:middle
存在するか確認します。もちろん存在します。
さきほど書き込んだので。

00:05:39.560 --> 00:05:42.920 align:middle
readStream で
読み込み用のストリームを作成します。

00:05:43.080 --> 00:05:46.880 align:middle
next を送って文字を見ていきます。

00:05:47.040 --> 00:05:51.480 align:middle
next メッセージで
h、e、l、…を得ていきます。

00:05:51.640 --> 00:05:54.240 align:middle
最初の next で h が得られ

00:05:54.400 --> 00:05:56.120 align:middle
続いて、残り全てを取り出します。

00:05:56.280 --> 00:05:59.200 align:middle
h を読んでからファイルの最後までを
読み込みました。

00:05:59.360 --> 00:06:01.840 align:middle
これで 最初の「h」を除いた
「ello World」が得られます。

00:06:02.000 --> 00:06:05.120 align:middle
最後にストリームオブジェクトに
close を送って
to the stream object,

00:06:05.280 --> 00:06:08.440 align:middle
ファイルを確実に閉じます。

00:06:09.160 --> 00:06:12.440 align:middle
close メッセージを使わずに

00:06:13.000 --> 00:06:16.400 align:middle
もっと簡単なコードで

00:06:16.560 --> 00:06:18.720 align:middle
書くことができます。

00:06:18.880 --> 00:06:22.240 align:middle
close メッセージを送り忘れたり
することがあります。

00:06:22.400 --> 00:06:26.200 align:middle
ファイルが閉じられていないために
例外が発生することもあります。

00:06:26.360 --> 00:06:30.720 align:middle
一般的に、自分で close を書かずに
済ませたいところです。

00:06:30.880 --> 00:06:33.360 align:middle
そのためには、書き込みでは

00:06:33.520 --> 00:06:36.640 align:middle
ファイルへの参照へ

00:06:36.800 --> 00:06:39.520 align:middle
writeStreamDo: メッセージを送ります。

00:06:39.680 --> 00:06:41.400 align:middle
引数としてブロックを渡すと

00:06:41.560 --> 00:06:45.400 align:middle
そのブロックが引数として
ストリームを受け取ります。

00:06:45.560 --> 00:06:49.280 align:middle
このストリームは writeStreamDo: が

00:06:49.440 --> 00:06:54.040 align:middle
そのファイルへの書き込み用ストリームとして
自動的に作って管理してくれます。

00:06:54.200 --> 00:06:56.840 align:middle
私がこのストリームでしなければならないことは

00:06:57.000 --> 00:06:59.960 align:middle
そのファイルでやりたいことをするために
ストリームを操作するだけです。

00:07:00.120 --> 00:07:04.560 align:middle
「Hello World」をファイルに書き込むには
stream nextPutAll: 'Hello World' とします。

00:07:04.720 --> 00:07:06.080 align:middle
ブロックが終了すると

00:07:06.240 --> 00:07:09.800 align:middle
ストリームが自動的に閉じられて
ファイルがディスクに書き込まれます。

00:07:11.240 --> 00:07:15.040 align:middle
読み込みでも readStreamDo: で
同じことができます。

00:07:16.200 --> 00:07:18.480 align:middle
ここでストリームが得られて
好きなように操作します。

00:07:18.640 --> 00:07:23.000 align:middle
ここでストリームの内容を受け取ります。

00:07:24.080 --> 00:07:25.920 align:middle
今回学んだことをまとめます。

00:07:26.480 --> 00:07:30.120 align:middle
ファイルやディレクトリは参照です。

00:07:30.320 --> 00:07:34.200 align:middle
ディスク上のファイルやディレクトリ
への参照です。

00:07:34.360 --> 00:07:38.880 align:middle
参照先は存在しているかもしれないし
存在していないかもしれません。

00:07:39.040 --> 00:07:41.560 align:middle
isFile や isDirectory で
存在するかどうかを確認します。

00:07:41.720 --> 00:07:43.040 align:middle
API はシンプルです。

00:07:43.200 --> 00:07:48.120 align:middle
ファイルのナビゲーションや操作を
提供します。

00:07:49.040 --> 00:07:54.120 align:middle
ファイルの読み書きを
ストリームを使って行います。

00:07:54.480 --> 00:07:57.480 align:middle
最後にストリームを閉じることを

00:07:57.640 --> 00:08:02.320 align:middle
自動的にやってくれる API があります。

