Ruby 1.9.3 & Windows でのファイル周りの話

Windows でのファイル周りを Ruby 1.8 と比較。

File.size が 4GB 以上のファイルでも正常に動く

$ ruby19 -e "p File.size('big')"
11995281408
$ ruby18 -e "p File.size('big')"
-889620480

1.8 では結果が狂っていたが、1.9 では正常な値を返す。

File 関係 APIUnicode 対応になっていた

軽く使った程度だか、UTF-8 のファイルパスを渡してもきちんと動くようになっている。File.size("啞.txt") とかも動く。

Dir.glob で UTF-8 のファイル名が取得できる

$ ruby19 -e "p Dir.glob('*'.encode('utf-8'))[0].encoding"
#<Encoding:UTF-8>

Dir.glob のパターン文字列の encoding で返ってくるファイルパスの encoding が決まる。
この仕様はドキュメントに書かれていない。Dir.glob の結果がスクリプトエンコーディングに影響された事があり、それで気付いた。

Dir.entries, Dir.foreach でも UTF-8 のファイル名が取得できる

$ ruby19 -e "p Dir.entries('.', :encoding => 'utf-8')[0].encoding"
#<Encoding:UTF-8>

こちらは :encoding 引数で指定する。
やはりドキュメントに書かれていない。[ruby-dev:35620] non-locale filename encoding のスレッドを読んでこのオプションを知った。

感想

Ruby 1.8 と比べて 1.9 は Windows でのファイル周りのサポートがしっかりしているので、Windows ユーザは Ruby 1.9 に移行すると幸せになれるかも。

使っている Ruby のバージョン

$ ruby19 -v
ruby 1.9.3p125 (2012-02-16 revision 34643) [i386-mingw32]
$ ruby18 -v
ruby 1.8.7 (2012-02-08 patchlevel 358) [i386-mingw32]