ファイルのサイズを取得するには?
Strongtalk のソースコードを読んでいたところ、このような記述を見つけた:
void Bootstrap::openFile() { stream_ = fopen( file_name_, "rb" ); if ( stream_ == NULL ) { has_error_ = true; lprintf( "\nCould not open file (%s) for reading!\n", file_name_ ); exit( -1 ); } int no = _fileno( stream_ ); file_size_ = _filelength( no ); }
file_name_
を fopen
関数で開き、_fileno
関数で inode 番号*1を取得し、
それに対応するファイルサイズを _filelength
関数によって取得するのだが、うにっくす環境には _fileno
や _filelength
が無いのである。
C言語でのファイルサイズ取得方法 を見ると、fseek
と SEEK_END
を使うのは脆弱なので、
fstat
を使えと書いてある。
ということで、書いてみた:
#include <sys/types.h> #include <sys/stat.h> #include <unistd.h> inline off_t get_file_size(const char* filename) { struct stat file_status; stat( filename, &file_status ); return file_status.st_size; }
動かせるようにしたものがこっちに置いてある。
VC++ では stat
の眷属が 12 種類もあることは見なかったことにしておく。
窓に!窓に!
ちなみに github の Strongtalk のコードでは該当箇所はコメントアウトされていた。
*1:と言って良いんだろうか?