読者です 読者をやめる 読者になる 読者になる

ファイルのサイズを取得するには?

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言語でのファイルサイズ取得方法 を見ると、fseekSEEK_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 種類もあることは見なかったことにしておく。
窓に!窓に!

ちなみに githubStrongtalkコードでは該当箇所はコメントアウトされていた。

*1:と言って良いんだろうか?