Issue #9772 has been updated by Yui NARUSE.
Akira T. wrote:
Yui NARUSE wrote:
他の方が互換実装を提供することに反対はしませんが、わたしがわざわざ実装する動機は欠けますね。
とすると、statvfs があるときは少なくとも statvfs の情報は提供することになるような気がしますね。
statvfs は POSIX で標準化されているので、結局、提案されているメソッドの実際の動作は
statvfs + 環境依存の様々な情報、ということになりそうな気がします。そうすると常に提供されると期待できるのは statvfs の部分なわけで、やっぱ名前は statvfs のほうがいい気がするなぁ。
(statfs を使ったときに f_fsid をどう提供するかという問題はあります。)
まぁ採否も含めてまつもとさんに判断頂く際に、名前も決めていただくってことでいいかと。
あるいは、もっと動機に率直なメソッドにしてしまうという手もあって、
ファイルシステムの種類を返すメソッドというように限定してしまうのもいいかもしれません。
そうすると、statfs/statvfs 以外の方法でファイルシステムの種類を得る実装も扱えるようになります。
たとえば、getmntent とか。実際に statfs/statvfs がなくて getmntent がある環境など、そういう備えが役に立つ環境があるかどうかは知りませんが。
いや、(GNU/Linux の) getmntent は /etc/mtab を読むから、
もしかして ext2/3/4 が判別できるという利点があるかも? (確認してません)
ふむ、確かに今のわたしのユースケースだとこちらのほうが適している気はしますね。
こちらはこちらでいじってみます。
こっちだと Etc.mntinfo とか Etc.df とかですかねぇ
Feature #9772: IO#statfs and File::Statfs
- Author: Yui NARUSE
- Status: Assigned
- Priority: Normal
- Assignee: Yukihiro M.
- Category:
- Target version:
IO#statfs and File::Statfs を追加しませんか。
(テストで statfs.f_type が必要だったのでとりあえず追加してしまっていますが)
statfs(2) は Unix 系 OS
でそこそこ普及している、あるパスが属するファイルシステムについての情報を得るためのシステムコールです。
OS によって多少差がありますが、だいたい以下の様な情報が得られます。
struct statfs {
uint32_t f_type; /* type of filesystem */
uint64_t f_bsize; /* filesystem fragment size */
uint64_t f_blocks; /* total data blocks in filesystem
/
uint64_t f_bfree; / free blocks in filesystem /
int64_t f_bavail; / free blocks avail to
non-superuser /
uint64_t f_files; / total file nodes in filesystem
/
int64_t f_ffree; / free nodes avail to
non-superuser /
char f_fstypename[MFSNAMELEN]; / filesystem type name */
};
f_type の値が OS 依存だったり、Linux 以外だとそもそもどれがどの値かきちんと定義されていないとか
ツッコミどころの多い API ではあるのですが、他では得られない情報が得られます。
たとえば、以前から CRuby で使われている用途としては、あるファイルの乗っているファイルシステムが、
HFS+ かどうかがわかります。言い換えると、ファイル名が正規化されているかどうかがわかります。
ありがちな反論として、書き込めば正規化されるかわかるだろうというのがありえますが、
目当てのファイルと同じディレクトリに書き込めるとは限りません。
違うディレクトリだと別のファイルシステムがマウントされている可能性があります。
なお今回の用途は、SEEK_DATA/SEEK_HOLEができるか否かを、実際にやってみる以外の方法で知りたかった、というものです。
(Rubyのテストなのにやってみて調べるではテストにあまりならない)