web-dev-qa-db-ja.com

fdでファイルサイズを取得するにはどうすればよいですか?

fseekFILE *のファイルサイズを取得できることはわかっていますが、私が持っているのはINTfdだけです。

この場合、どうすればファイルサイズを取得できますか?

15
R__

lseek を起点としてSEEK_ENDを使用すると、ファイル内の新しいオフセットが返されます。

off_t fsize;

fsize = lseek(fd, 0, SEEK_END);
17
Hasturkun

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 */
       …
       };
17
Seth Robertson

コードサンプルを関数として記述して、コードにカットアンドペーストできるようにします。

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);
}
4
Michael Potter