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 があります。