よもやま話β版

よもやま話を書きます。内容はぺらぺら。自由に書く。

File.stat('testfile').mode の戻り値について調べた

戻り値が何を意味するのか調べた備忘録。 前提として対象ファイルのパーミッションについて知るためにこのメソッドが使えそうということが把握できている状態である。

mode の値は8進数

https://docs.ruby-lang.org/en/2.7.0/File/Stat.html#method-i-mode

File.chmod(0644, "testfile")   #=> 1
s = File.stat("testfile")
sprintf("%o", s.mode)          #=> "100644"

まず sprintf("%o", s.mode) とあるので、 s.mode の戻り値は8進数にして確認すれば良さそうということがわかる。

mode はどんな情報を持つか

次にこの mode の8進数から何を読み取ればいいのか確認する。

Returns an integer representing the permission bits of stat. The meaning of the bits is platform dependent; on Unix systems, see stat(2).

このように書かれているのでUnixのstat(2)あたりを目標にわかりやすい資料を探してみる。

http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2002/2002-06-17/

モードが8進数で 0100644 (C言語の文法で、0から始まる数は、8進 数)であることから、ファイルの型(普通のファイルかディレクトリかという 情報)を調べることができる。

ここに乗っていた図がとてもわかりやすかった。 自分の理解を足してさらに噛み砕くとこんな感じの解釈になった。

modeの8進数と2進数の変換

ということで 100644 の上2桁で型の情報、下3桁でパーミッションの情報を表していると読み取れる。

型の情報の定義の確認

0100644の上位4ビット、つまり、0170000と AND (C言語のでは、 &演算子)をとった結果は 0100000 となる。この値は、普通のファ イル(regular file)を意味する。

ANDを取るというのは、2進数のとき同じ桁がどちらも1だった場合1にする、ということなので上位ビットのみ取り出すという意味合いになります。

ANDと16進数表現

そして <sys/stat.h> の表記は 0x8000 となっていて、16進数8000を表すので regular file を表すということを把握できる。

#define S_IFREG         0x8000  /* regular */

おまけ

  • 8進数を表現するとき、先頭に0がつく。 0100644
  • 16進数を表現するとき、先頭に0xがつく。0x8000

参考

ググらないと生きていけない脳みそだ...webの世界ありがとう。