👌
【Ruby 4.0 Advent Calender】Linux 環境でもFile::Stat#birthtimeがサポートされる【11日目】
Ruby 4.0 Advent Calender 11日目の記事です。
これはなに
今年 2025年12月25日にリリースされる予定の Ruby 4.0 の新機能や変更点などを1つずつ紹介していく Advent Calender になります。
基本的には NEWS に載っている機能を紹介すると思うんですがここにない機能についても書くかもしれません。
また、記事を書いてる時点ではまだ Ruby 4.0 はリリースされる前なので Ruby 4.0 がリリースされた時点で機能が変わっている 可能性があるかもしれないので注意してください。
記事のまとめは ここを参照 してください。
Linux 系でも File::Stat#birthtime がサポートされるようになった
File::Stat#birthtime では対象のファイルの作成時刻を返します。
p File.stat("./test.rb").birthtime
# => 2025-12-07 21:28:57.203894351 +0900
この動作は実行環境に依存しており amd64-freebsd14 では動作するが x86_64-linux のような環境では実行時エラーになっていました。
p RbConfig::CONFIG["platform"]
# => "x86_64-linux"
p File.stat("./test.rb").birthtime
# => error: birthtime() function is unimplemented on this machine (NotImplementedError)
これは Ruby 4.0 からは Linux 系の環境でも動作するようにサポートが追加されました。
p RbConfig::CONFIG["platform"]
# => "x86_64-linux"
p File.stat("./test.rb").birthtime
# Ruby 3.4 => error: birthtime() function is unimplemented on this machine (NotImplementedError)
# Ruby 4.0 => 2025-12-07 21:28:57.203894351 +0900
ちなみに Ruby 3.4 でも Linux 系でファイルの作成時刻を取得したい場合は File.birthtime が利用できます。
p RbConfig::CONFIG["platform"]
# => "x86_64-linux"
p File.birthtime("./test.rb")
# => 2025-12-07 21:28:57.203894351 +0900
内部的なお話
元々 Ruby 3.4 では File::Stat の内部では stat(2) が利用されていました。
Linux だと stat(2) に birthtime 相当の情報が含まれておらず取得することができない状態でした。
これが RUby 4.0 から statx(2) の方を利用することで birthtime が取得できるように対応されました。
元々 File.birthtime の方もこの statx(2) を利用していたみたいですね。
Discussion