Как вы получаете размер файла по FD? - PullRequest
14 голосов
/ 30 июня 2011

Я знаю, что могу получить размер файла FILE * на fseek, но у меня есть только INT fd.

Как я могу получить размер файла в этом случае?

Ответы [ 3 ]

17 голосов
/ 30 июня 2011

Вы можете использовать lseek с SEEK_END в качестве источника, поскольку он возвращает новое смещение в файле, например.

off_t fsize;

fsize = lseek(fd, 0, SEEK_END);
16 голосов
/ 30 июня 2011

Фстат будет работать.Но я не совсем уверен, как вы планируете получить размер файла с помощью fseek, если вы также не используете ftell (например, fseek до конца, затем ftell, где вы находитесь).fstat лучше, даже для FILE, поскольку вы можете получить дескриптор файла из дескриптора FILE (через fileno).

   stat, fstat, lstat - get file status
   int fstat(int fd, struct stat *buf);

       struct stat {
       …
           off_t     st_size;    /* total size, in bytes */
       …
       };
3 голосов
/ 01 июля 2016

Мне нравится писать примеры кода в виде функций, чтобы они были готовы вырезать и вставлять в код:

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);
}
...