戻り値が何を意味するのか調べた備忘録。 前提として対象ファイルのパーミッションについて知るためにこのメソッドが使えそうということが把握できている状態である。
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進 数)であることから、ファイルの型(普通のファイルかディレクトリかという 情報)を調べることができる。
ここに乗っていた図がとてもわかりやすかった。 自分の理解を足してさらに噛み砕くとこんな感じの解釈になった。
ということで 100644
の上2桁で型の情報、下3桁でパーミッションの情報を表していると読み取れる。
型の情報の定義の確認
0100644の上位4ビット、つまり、0170000と AND (C言語のでは、 &演算子)をとった結果は 0100000 となる。この値は、普通のファ イル(regular file)を意味する。
ANDを取るというのは、2進数のとき同じ桁がどちらも1だった場合1にする、ということなので上位ビットのみ取り出すという意味合いになります。
そして <sys/stat.h> の表記は 0x8000
となっていて、16進数8000を表すので regular file を表すということを把握できる。
#define S_IFREG 0x8000 /* regular */
おまけ
- 8進数を表現するとき、先頭に0がつく。 0100644
- 16進数を表現するとき、先頭に0xがつく。0x8000
参考
ググらないと生きていけない脳みそだ...webの世界ありがとう。
- https://docs.ruby-lang.org/ja/latest/method/File=3a=3aStat/i/mode.html
- https://docs.ruby-lang.org/en/2.7.0/File/Stat.html#method-i-mode
- http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2002/2002-06-17/
- https://linuxjm.osdn.jp/html/LDP_man-pages/man2/stat.2.html
- https://yu8as.hatenablog.com/entry/2018/11/20/130336
- http://www2u.biglobe.ne.jp/~MAS/ruby/A5D5A5A1A5A4A5EBA5D1A1BCA5DFA5C3A5B7A5E7A5F3A4CEBCE8C6C0.html
- https://qiita.com/ironsand/items/d5e4debe276beab7c6cf
- https://www.softel.co.jp/blogs/tech/archives/5313
- https://qiita.com/ATS534/items/1cd31518f20b0dc0f078