fseek
でFILE *
のファイルサイズを取得できることはわかっていますが、私が持っているのはINTfdだけです。
この場合、どうすればファイルサイズを取得できますか?
lseek
を起点としてSEEK_END
を使用すると、ファイル内の新しいオフセットが返されます。
off_t fsize;
fsize = lseek(fd, 0, SEEK_END);
fstatは機能します。ただし、ftellも使用しない限り、fseekを介してファイルサイズを取得する方法が正確にはわかりません(たとえば、最後までfseekを実行してから、現在の場所でftellを実行します)。 fstatは、FILEハンドルから(filenoを介して)ファイル記述子を取得できるため、FILEの場合でも優れています。
stat, fstat, lstat - get file status
int fstat(int fd, struct stat *buf);
struct stat {
…
off_t st_size; /* total size, in bytes */
…
};
コードサンプルを関数として記述して、コードにカットアンドペーストできるようにします。
int fileSize(int fd) {
struct stat s;
if (fstat(fd, &s) == -1) {
int saveErrno = errno;
fprintf(stderr, "fstat(%d) returned errno=%d.", fd, saveErrno);
return(-1);
}
return(s.st_size);
}