👋
[Feature #21205] File.birthtime と File::Stat#birthtime で差異がある話
[Feature #21205] Make File::Stat#birthtime available on Linux
- Linux 系では
File.birthtimeでファイルの作成日を取得できるがFile::Stat#birthtimeでは取得できない
# FreeBSD だと両方取得できる
RbConfig::CONFIG["platform"] #=> "amd64-freebsd14"
(File.birthtime "/").class #=> Time
(File.stat "/").birthtime.class #=> Time
# Linux では File::Stat#birthtime がエラーになる
RbConfig::CONFIG["platform"] #=> "x86_64-linux"
(File.birthtime "/").class #=> Time
(File.stat "/").birthtime # raises NotImplementedError
- この挙動が混乱するというチケット
- これなんですが
File::Statは内部でstat(2)を利用しているみたいなんですが Linux だとこれにbirthtime相当の情報が含まれていないのが原因みたいらしい - 一方で
File.birthtimeではstatx(2)を利用しているとのこと - なので対応する場合は
stat(2)ではなくてstatx(2)を利用するようにする必要があるみたいですね - 最終的には
statx(2)を使用するように変更し Ruby 3.5-dev では Linux でもFile::Stat#birthtimeが利用できるようになる
pp File.stat("./test.rb").birthtime
# Ruby 3.4 => error: birthtime() function is unimplemented on this machine (NotImplementedError)
# Ruby 3.5 => 2025-09-14 17:25:09.459701402 +0900
Discussion