Ruby 画像ダウンロード編 (5) File について 【計算数学 I】

更新日時:

File クラス

このセクションと次のセクションでやりたいことは、Ruby プログラムと同じディレクトリに「 icons 」というディレクトリを作るプログラムを書くことです。 その前段階として、「Ruby プログラムと同じディレクトリの『 icons 』というディレクトリ」を指し示す、フルパスを手に入れる必要があります。これをこのセクションでやります。 どうしてフルパスなのかは後で説明します。

フルパスの取得

実行中のファイル名は、__FILE__ という定数(正確には擬似変数)に格納されています。右側も左側もアンダーバーは2つです。 __FILE__ は単にファイル名を持っているだけの変数ではありません。フルパスも記憶しています。それを引き出すには File クラスの、クラスメソッド expand_path を用います。

演習

実際に、次のプログラムを書いて、適当なディレクトリに適当なファイル名で保存し、Ruby 処理系に実行させ、結果を確認しましょう。

puts __FILE__
puts File.expand_path(__FILE__)

注: puts は、文字列を標準出力に改行付きで出力する命令です。

これで、実行中のファイルのフルパスは手に入ったわけですが、 「実行中プログラムと同じディレクトリの『 icons 』というディレクトリ」はどのように指し示せばよいでしょうか。 実は File.expand_path は、正確には 2 つの引数を取ります。上の実行方法は 1 つ目の引数を省略したものです。

File.expand_path(相対パスを示した文字列, __FILE__)

で、「『__FILE__ から見た、相対パスを指し示すファイルまたはディレクトリ』へのフルパス」を返します。 相対パスの指定の仕方は、Linux 標準教科書で習得済みかと思います。

演習

次のプログラムの空欄を埋めて、「このプログラムと同じディレクトリの『 icons 』というディレクトリ」のフルパスを表示するプログラムを完成させましょう。そのディレクトリは、今のところ実際はなくても構いません。

str = # 文字列で相対パスを記述する
puts File.expand_path(str, __FILE__)

補足: # 以降に書かれたその行の文字列は Ruby 処理系に無視されます。いわゆるコメントです。

受講生へ:何度間違えても困らないから、試行錯誤で正解にたどり着きましょう。相対パスの指定方法がわからないなら Linux 標準教科書を読みましょう。

TA へ:ここで多くの受講生が躓くので、指導よろしくお願いします。

どうしてフルパスを取得させる必要があるの?

ディレクトリをつくるなら、ターミナルで mkdir icons とすればよいです。 また Ruby プログラムに直接 shell スクリプトを記述することはできます。だから File.expand でフルパスを取得する意味は、ないように見える方もいらっしゃるかもしれません。しかし、その場合は問題が生じます。 なぜなら、Ruby 処理系は Ruby 処理系を実行したディレクトリを起点とするため、Ruby 処理系を実行するディレクトリによって、結果が変わります。これは望ましいことではありません。 つまり、mkdir icons というシェルスクリプトを Ruby プログラムに埋め込んでこれを Ruby 処理系で実行しても、icons というディレクトリが作成されるのは Ruby 処理系を実行したディレクトリであって、実行した Ruby プログラムが置いてあるディレクトリではないのです。

だから、Ruby プログラムの内部でフルパスを計算させることにしました。 この計算では、Ruby 処理系をどのディレクトリで実行したかには関係なく、「Ruby プログラムの置いてあるディレクトリにある icons ディレクトリ」をフルパスで入手することができます。

もちろん shell スクリプトだけでこの問題を回避することもできるのですが、Ruby プログラムの中で取得できるならそれに越したことはないでしょう。

補足

ここまで一生懸命 __FILE__ の使い方について説明してきておいてがっかりさせるようなことを言うかもしれませんが、 実は Ruby 2.0 以降では File.expand_path(__dir__) で簡単にプログラムが置かれているディレクトリのフルパスを手に入れることができます。 ですからこれに "/icons" を文字列として結合するだけで終わってしまいます。 実習で使う Linux distribution は毎年違いますが、2016年度に使用した Ubuntu では、実習資料集の方法で処理系を入れると、2.3.0 が入りました。 ゆえに、この記法でも動くでしょう。

フルパスからファイル名の取得

File.basename で簡単に取得することができます。下の実行例を参考にしてください。

irb(main):001:0> url = "http://utmsks.github.io/images/2016pchardware.jpg"
=> "http://utmsks.github.io/images/2016pchardware.jpg
irb(main):002:0> File.basename(url)
=> "2016pchardware.jpg"

ナビゲーション

この教材は、東京大学理学部数学科専門科目「計算数学 I」のために執筆されたものです。 このサイトに掲載する際に、記事を分けてあります。 他の回はRuby 画像ダウンロード編 一覧 #ks1-ruby-downloadから御覧ください。

Ruby 入門 (計算数学実習資料集)には他の TA が書いた教材があります。

コメントする