やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

組込ライブラリ(File::Stat)

 ファイル情報。

成果物

情報源

File::Stat

ファイルの情報を格納したオブジェクトのクラス。

FileTest に同名のモジュール関数がある場合はそれと同じ働きをします。ただ、ファイル名を引数に取るかわりに Stat 自身について判定する点が違います。

p File::Stat.new($0).directory? #=> false
p FileTest.directory?($0) #=> false

1.8 以降では、属性メソッドがシステムでサポートされていない場合 nil が返ります。なお、1.7 以前では 0 が返っていました。

dev         デバイス番号(ファイルシステム)
dev_major   dev の major 番号部
dev_minor   dev の minor 番号部
ino         i-node 番号
mode        ファイルモード
nlink       ハードリンクの数
uid         オーナーのユーザID
gid         オーナーのグループID
rdev        デバイスタイプ(スペシャルファイルのみ)
rdev_major  rdev の major 番号部
rdev_minor  rdev の minor 番号部
size        ファイルサイズ(バイト単位)
blksize     望ましいI/Oのブロックサイズ
blocks      割り当てられているブロック数
atime       最終アクセス時刻
mtime       最終更新時刻
ctime       最終状態変更時刻(状態の変更とは chmod などによるもので、Unix では i-node の変更を意味します)

メンバ抜粋

特異メソッド

new

インスタンスメソッド

<=> atime birthtime blksize blockdev? blocks chardev? ctime dev dev_major dev_minor directory? executable? executable_real? file? ftype gid grpowned? ino mode mtime nlink owned? pipe? rdev rdev_major rdev_minor readable? readable_real? setgid? setuid? size size? socket? sticky? symlink? uid world_readable? world_writable? writable? writable_real? zero?

new

new(path) -> File::Stat

path に関する File::Stat オブジェクトを生成して返します。 File.stat と同じです。

 ならFile.statでいいじゃんね。

p $:[0]
#=> 例
# "C:/Program Files/ruby-1.8/lib/ruby/site_ruby/1.8"
p File::Stat.new($:[0])
#=> 例
#<File::Stat dev=0x2, ino=0, mode=040755, nlink=1, uid=0, gid=0, rdev=0x2, size=0, blksize=nil, blocks=nil, atime=Sun Sep 02 14:15:20 +0900 2007, mtime=Tue Apr 24 23:03:44 +0900 2007, ctime=Tue Apr 24 23:03:37 +0900 2007>

atime, ctime, mtime, birthtime

メソッド 意味
birthtime ファイル作成日時
atime 最終アクセス日時
ctime 最終状態変更日時(chmod等)
mtime 最終更新日時

 残念ながら2021年ラズパイOSではbirthtimeが取得できない。

$ touch a.txt
$ stat a.txt
  File: a.txt
  Size: 0          Blocks: 0          IO Block: 4096   通常の空ファイル
Device: 31h/49d Inode: 435         Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/      pi)   Gid: ( 1000/      pi)
Access: 2021-11-09 10:19:27.711385689 +0900
Modify: 2021-11-09 10:19:27.711385689 +0900
Change: 2021-11-09 10:19:27.711385689 +0900
 Birth: -
$ stat --version
stat (GNU coreutils) 8.30
Copyright (C) 2018 Free Software Foundation, Inc.
...

 未だに実装されていないとか時代遅れにもほどがある。

 そもそもサーバなど異なるファイルシステム間においてStat情報が共有できない。OSやファイルシステム差異のせいでクロスプラットフォームに扱えない情報。すごくダサい。

<=>

 ファイル最終更新日時mtimeを比較する。

size

 ファイルサイズをバイト単位で返す。

 ファイル種別がそれなら真を返す。

所感

 必要になったらもっと詳しく勉強すればいい。たぶんそんなに必要ない。

対象環境

$ uname -a
Linux raspberrypi 5.10.52-v7l+ #1441 SMP Tue Aug 3 18:11:56 BST 2021 armv7l GNU/Linux