👋

[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
GitHubで編集を提案

Discussion