RubyのFileとFileUtilsの違い

何となくモヤッとしたまま必要なときにメソッドを調べて使っていたけど、FileとFileUtilsの違いは、Fileが文字通りファイルを抽象化するクラスで、その属性やタイプを調べたり、読み書きしたりするためのもの。ファイルをオブジェクトとして扱うだけではなく、文字列でパスを渡して属性を調べるタイプのクラスメソッドも結構多い。

Fileでは、delete(unlink)で削除できたり、renameできたり、かすかにFileUtilsと重複している部分でもあるので、最初、うっかり区別が付きづらいけど、メソッドを並べてみれば自明なように、FileUtilsのほうはUnixファイル操作コマンド全般をマップしている。しかもよくみると、「ln -sf」を「FileUtils#lnsf」のように頻出のオプションをメソッド名に組み込んだようなものもある。つまり、FileUtilsはずばり、Unixのファイル操作関連コマンドをモジュールで提供するもので、インクルードしてしまえば、Rubyの中でUnixのコマンドが使えるという感じ。そもそもFileUtilsは、名前空間としてモジュールを使ってるだけっぽい。一方、FileはクラスでIOを継承していて、EnumerableやFileUtilsの一部をmixinしている。あ、IOがEnumerableをインクルードしているのか。

Fileはもともと、ftoolsというライブラリ(?)をrequireすると、File.copyみたいなクラスメソッドが使えるようになるという使われ方があったようだ。それでdeleteもcopyもできちゃったりして、ますます重複が多くて混乱していた、ということか。最近のRubyではファイル操作全般にはftoolsは非推奨で、FileUtilsを使えということになっている。1.9ではftoolsは使えない。unlinkはFileの抽象化の範疇で、そこだけ重複感が残っているという感じかな。なるほど、1.9でこの辺スッキリしたのね。

ファイルを読むときはFile.open("foo").readでオッケーとかいうイディオムで覚えるんじゃなくて、最初からちゃんと調べるべきだった。IOとPOSIXをちゃんと調べ直すのがよさげ。