Ruby 4.1 リファレンスマニュアル

class File::Stat

[edit]

要約

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

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 の変更を意味します)

目次

特異メソッド
インスタンスメソッド

継承しているメソッド

Comparableから継承しているメソッド

特異メソッド

new(path) -> File::Stat[permalink][rdoc][edit]
(String file) → void

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

[PARAM] path:
ファイルのパスを指定します。
[EXCEPTION] Errno::ENOENT:
pathに該当するファイルが存在しない場合発生します。
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>

インスタンスメソッド

self <=> o -> -1 | 0 | 1 | nil[permalink][rdoc][edit]
(File::Stat other) → Integer
(untyped) → nil

ファイルの最終更新時刻を比較します。self が other よりも新しければ 1 を、等しければ 0 を、古ければ -1 を返します。比較できない場合は nil を返します。

[PARAM] o:
File::Stat のインスタンスを指定します。
require 'tempfile' # for Tempfile

fp1 = Tempfile.open("first")
fp1.print "古い方\n"
sleep(1)
fp2 = Tempfile.open("second")
fp2.print "新しい方\n"

p File::Stat.new(fp1.path) <=> File::Stat.new(fp2.path) # => -1
p File::Stat.new(fp2.path) <=> File::Stat.new(fp1.path) # =>  1
p File::Stat.new(fp1.path) <=> fp2.path # => nil
atime -> Time[permalink][rdoc][edit]
() → Time

最終アクセス時刻を返します。

fs = File::Stat.new($0)
#例
p fs.atime.to_a  # => [45, 5, 21, 5, 9, 2007, 3, 248, false, "\223\214\213\236 (\225W\217\200\216\236) "]

[SEE_ALSO] Time

birthtime -> TimeRuby 2.2.0 から[permalink][rdoc][edit]
() → Time

作成された時刻を返します。

[EXCEPTION] NotImplementedError:
Windows のような birthtime のない環境で発生します。
File.write("testfile", "foo")
sleep 10
File.write("testfile", "bar")
sleep 10
File.chmod(0644, "testfile")
sleep 10
File.read("testfile")
p File.stat("testfile").birthtime # => 2014-02-24 11:19:17 +0900
p File.stat("testfile").mtime     # => 2014-02-24 11:19:27 +0900
p File.stat("testfile").ctime     # => 2014-02-24 11:19:37 +0900
p File.stat("testfile").atime     # => 2014-02-24 11:19:47 +0900
blksize -> Integer[permalink][rdoc][edit]
() → Integer?

望ましいI/Oのブロックサイズを返します。

fs = File::Stat.new($0)
#例
p fs.blksize # => nil
blockdev? -> bool[permalink][rdoc][edit]
() → bool

ブロックスペシャルファイルの時に真を返します。

Dir.glob("/dev/*") {|bd|
  if File::Stat.new(bd).blockdev?
    puts bd
  end
}
#例
#...
# => /dev/hda1
# => /dev/hda3
#...
blocks -> Integer[permalink][rdoc][edit]
() → Integer?

割り当てられているブロック数を返します。

fs = File::Stat.new($0)
#例
p fs.blocks  # => nil
chardev? -> bool[permalink][rdoc][edit]
() → bool

キャラクタスペシャルファイルの時に真を返します。

Dir.glob("/dev/*") {|bd|
  if File::Stat.new(bd).chardev?
    puts bd
  end
}
#例
#...
# => /dev/tty1
# => /dev/stderr
#...
ctime -> Time[permalink][rdoc][edit]
() → Time

最終状態変更時刻を返します。 (状態の変更とは chmod などによるもので、Unix では i-node の変更を意味します)

fs = File::Stat.new($0)
#例
p fs.ctime.to_f   # => 1188719843.0

[SEE_ALSO] Time

dev -> String[permalink][rdoc][edit]
() → Integer

デバイス番号(ファイルシステム)を返します。

fs = File::Stat.new($0)
p fs.dev
#例
# => 2
dev_major -> Integer[permalink][rdoc][edit]
() → Integer

dev の major 番号部を返します。

fs = File::Stat.new($0)
p fs.dev_major
#例
# => nil #この場合ではシステムでサポートされていないため
dev_minor -> Integer[permalink][rdoc][edit]
() → Integer

dev の minor 番号部を返します。

fs = File::Stat.new($0)
p fs.dev_minor
#例
# => nil
directory? -> bool[permalink][rdoc][edit]
() → bool

ディレクトリの時に真を返します。

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

[SEE_ALSO] FileTest?.directory?

executable? -> bool[permalink][rdoc][edit]
() → bool

実効ユーザ/グループIDで実行できる時に真を返します。

p File::Stat.new($0).executable?
# 例
# => true
executable_real? -> bool[permalink][rdoc][edit]
() → bool

実ユーザ/グループIDで実行できる時に真を返します。

p File::Stat.new($0).executable_real?
#例
# => true
file? -> bool[permalink][rdoc][edit]
() → bool

通常ファイルの時に真を返します。

p File::Stat.new($0).file? # => true
ftype -> String[permalink][rdoc][edit]
() → String

ファイルのタイプを表す文字列を返します。

文字列は以下のうちのいずれかです。

"file"
"directory"
"characterSpecial"
"blockSpecial"
"fifo"
"link"
"socket"

"unknown"
fs = File::Stat.new($0)
p fs.ftype # => "file"
p File::Stat.new($:[0]).ftype # => "directory"

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

gid -> Integer[permalink][rdoc][edit]
() → Integer

オーナーのグループIDを返します。

fs = File::Stat.new($0)
#例
p fs.gid      # => 0
grpowned? -> bool[permalink][rdoc][edit]
() → bool

グループIDが実効グループIDと等しい時に真を返します。

補助グループIDは考慮されません。

printf "%s %s\n", $:[0], File::Stat.new($:[0]).grpowned?
#例
# => /usr/local/lib/site_ruby/1.8 false
printf "%s %s\n", $0, File::Stat.new($0).grpowned?
#例
# => filestat.rb true
ino -> Integer[permalink][rdoc][edit]
() → Integer

i-node 番号を返します。

fs = File::Stat.new($0)
#例
p fs.ino      # => 0
mode -> Integer[permalink][rdoc][edit]
() → Integer

ファイルモードを返します。

fs = File::Stat.new($0)
printf "%o\n", fs.mode
#例
# => 100644
mtime -> Time[permalink][rdoc][edit]
() → Time

最終更新時刻を返します。

fs = File::Stat.new($0)
#例
p fs.mtime   # => Wed Sep 05 20:42:18 +0900 2007

[SEE_ALSO] Time

() → Integer

ハードリンクの数を返します。

fs = File::Stat.new($0)
#例
p fs.nlink    # => 1
owned? -> bool[permalink][rdoc][edit]
() → bool

自分のものである時に真を返します。

printf "%s %s\n", $:[0], File::Stat.new($:[0]).owned?
#例
# => /usr/local/lib/site_ruby/1.8 false
pipe? -> bool[permalink][rdoc][edit]
() → bool

無名パイプおよび名前つきパイプ(FIFO)の時に真を返します。

system("mkfifo /tmp/pipetest")
p File::Stat.new("/tmp/pipetest").pipe? # => true
rdev -> Integer[permalink][rdoc][edit]
() → Integer?

デバイスタイプ(スペシャルファイルのみ)を返します。

fs = File::Stat.new($0)
#例
p fs.rdev     # => 2
rdev_major -> Integer[permalink][rdoc][edit]
() → Integer

rdev の major 番号部を返します。

fs = File::Stat.new($0)
#例
p fs.rdev_major # => nil
rdev_minor -> Integer[permalink][rdoc][edit]
() → Integer

rdev の minor 番号部を返します。

fs = File::Stat.new($0)
#例
p fs.rdev_minor # => nil
readable? -> bool[permalink][rdoc][edit]
() → bool

読み込み可能な時に真を返します。

p File::Stat.new($0).readable? # => true
readable_real? -> bool[permalink][rdoc][edit]
() → bool

実ユーザ/実グループによって読み込み可能な時に真を返します。

p File::Stat.new($0).readable_real? # => true
setgid? -> bool[permalink][rdoc][edit]
() → bool

setgidされている時に真を返します。

Dir.glob("/usr/sbin/*") {|bd|
  if File::Stat.new(bd).setgid?
    puts bd
  end
}
#例
#...
# => /usr/sbin/postqueue
#...
setuid? -> bool[permalink][rdoc][edit]
() → bool

setuidされている時に真を返します。

Dir.glob("/bin/*") {|bd|
  if File::Stat.new(bd).setuid?
    puts bd
  end
}
#例
#...
# => /bin/ping
# => /bin/su
#...
size -> Integer[permalink][rdoc][edit]
() → Integer

ファイルサイズ(バイト単位)を返します。

fs = File::Stat.new($0)
#例
p fs.size    # => 1548
size? -> Integer | nil[permalink][rdoc][edit]
() → Integer?

サイズが0の時にはnil、それ以外の場合はファイルサイズを返します。

require 'tempfile'

fp = Tempfile.new("temp")
p fp.size # => 0
p File::Stat.new(fp.path).size? # => nil
fp.print "not 0 "
fp.close
p FileTest.exist?(fp.path) # => true
p File::Stat.new(fp.path).size? # => 6
socket? -> bool[permalink][rdoc][edit]
() → bool

ソケットの時に真を返します。

Dir.glob("/tmp/*"){|file|
  if File::Stat.new(file).socket?
    printf "%s\n", file
  end
}
#例
# => /tmp/uimhelper-hogehoge
#...
sticky? -> bool[permalink][rdoc][edit]
() → bool

stickyビットが立っている時に真を返します。

Dir.glob("/usr/bin/*") {|bd|
  begin
    if File::Stat.new(bd).sticky?
      puts bd
    end
  rescue
  end
}
#例
#...
# => /usr/bin/emacs-21.4
#...
() → bool

シンボリックリンクである時に真を返します。ただし、File::Statは自動的にシンボリックリンクをたどっていくので常にfalseを返します。

require 'fileutils'
outfile = $0 + ".ln"
FileUtils.ln_s($0, outfile)
p File::Stat.new(outfile).symlink? # => false
p File.lstat(outfile).symlink?     # => true
p FileTest.symlink?(outfile)       # => true

[SEE_ALSO] File.lstat

uid -> Integer[permalink][rdoc][edit]
() → Integer

オーナーのユーザIDを返します。

fs = File::Stat.new($0)
#例
p fs.uid    # => 0
world_readable? -> Integer | nilRuby 1.9.3 から[permalink][rdoc][edit]
() → Integer?

全てのユーザから読めるならば、そのファイルのパーミッションを表す整数を返します。そうでない場合は nil を返します。

整数の意味はプラットフォームに依存します。

m = File.stat("/etc/passwd").world_readable?  # => 420
p sprintf("%o", m)                            # => "644"
world_writable? -> Integer | nilRuby 1.9.3 から[permalink][rdoc][edit]
() → Integer?

全てのユーザから書き込めるならば、そのファイルのパーミッションを表す整数を返します。そうでない場合は nil を返します。

整数の意味はプラットフォームに依存します。

m = File.stat("/tmp").world_writable?         # => 511
p sprintf("%o", m)                            # => "777"
writable? -> bool[permalink][rdoc][edit]
() → bool

書き込み可能な時に真を返します。

p File::Stat.new($0).writable? # => true
writable_real? -> bool[permalink][rdoc][edit]
() → bool

実ユーザ/実グループによって書き込み可能な時に真を返します。

p File::Stat.new($0).writable_real? # => true
zero? -> bool[permalink][rdoc][edit]
() → bool

サイズが0である時に真を返します。

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