Dir.chdir(File.expand_path(File.dirname(__FILE__)))Dir.chdir(File.dirname(File.expand_path(__FILE__)))
他のスクリプトからrequire/loadで読み出されるスクリプトで、そのスクリプトファイルからの相対ディレクトリのファイルを(永続化などで)指定していたりするときに利用します。
追記:Pathnameライブラリを使った場合('14/4/14追記)
class Pathname
クラスの継承リスト: Pathname < Object < Kernel < BasicObject
要約
パス名をオブジェクト指向らしく扱うクラスです。
Pathname オブジェクトはパス名を表しており、ファイルやディレクトリそのものを表してはいません。 当然、存在しないファイルのパス名も扱えます。
絶対パスも相対パスも扱えます。
Pathname オブジェクトは immutable であり、自身を破壊的に操作するメソッドはありません。
class Pathname (Ruby 1.9.3)
オブジェクト指向のRubyを使うなら、やはりファイルやディレクトリなどもオブジェクト指向でやりたいですよね。
ということで、スクリプトファイルのあるディレクトリをPathnameで取得してみます。
Pathname(__FILE__).expand_path.dirname
メソッドチェーンで得られるのがオブジェクト指向っぽいですねw
このディレクトリへ移動する場合には、このインスタンスをそのままDir.chdirの引数に与えれば良いです。Pathname#to_sは不要です。
Dir.chdir(Pathname(__FILE__).expand_path.dirname)
これも使ってみましょう。
2013/8/6追記:
Windows XPでruby 1.9.3p448(i386-mingw32)の場合、File.expand_path(File.dirname(__FILE__))だとexpand_pathの際に日本語名フォルダが文字化けします。
先にexpand_pathしたFile.dirname(File.expand_path(__FILE__))ならば問題なし。
だいたいのイディオムではFile.expand_path(File.dirname(__FILE__))と書いてあるだけど、確認したところ
File.dirname(File.expand_path(__FILE__))
のほうが良いことが分かった。
適切な書き順のものが使われてない
ググってみると
△ google:"File.expand_path(File.dirname(__FILE__))" → 約 571,000 件
◎ google:"File.dirname(File.expand_path(__FILE__))" → 約 45,700 件
となっている(2013/8/6現在)。
でも
まずexpandして引き続きファイル名削除、という順番のほうがオススメです。
先にファイル名削除すると単に「.」になってしまい、にっちもさっちもいかなくなることもあります。
ぜひ File.dirname(File.expand_path(__FILE__))
(もしくは Pathname(__FILE__).expand_path.dirname
)を使いましょう。