2012-01-11 2 views

ответ

2

Это один из способов сделать это, если ваши файлы не слишком большие (что для 32-разрядной системы или 64-разрядной версии Windows означает не более 2 гигабайт). У этого есть заслуга более или менее работы на любой платформе. Конечно, ftell() возвращает long, а не int (так что в 64-битной системе, отличной от Windows, файлы, на которые он может отчитываться, намного больше, если вы исправляете свой код соответственно). Тем не менее, требуя четырех вызовов функций, это дорого стоить.

Альтернативы POSIX: stat(), lstat() и fstat().

В API Windows будут аналоги.

+0

Лучшей альтернативой POSIX является 'fseeko' и' ftello'. Использование семейства 'stat' не будет правильно получать размер для блочных устройств и других необычных файлов. –

+0

И вы не можете искать на терминале или трубе ... есть все ограничения. –

+0

Если файл не имеет размера, задание размера не является значимой операцией. Мой подход дает правильный ответ, когда существует ответ. –

0

Вы можете использовать stat() или fstat(), если были на * nix.

0

Использование stat:

#include <sys/stat.h> 

int stat(const char *path, struct stat *buf); 

struct stat { 
      dev_t  st_dev;  /* ID of device containing file */ 
      ino_t  st_ino;  /* inode number */ 
      mode_t st_mode; /* protection */ 
      nlink_t st_nlink; /* number of hard links */ 
      uid_t  st_uid;  /* user ID of owner */ 
      gid_t  st_gid;  /* group ID of owner */ 
      dev_t  st_rdev; /* device ID (if special file) */ 
--->  off_t  st_size; /* total size, in bytes */ 
      blksize_t st_blksize; /* blocksize for file system I/O */ 
      blkcnt_t st_blocks; /* number of 512B blocks allocated */ 
      time_t st_atime; /* time of last access */ 
      time_t st_mtime; /* time of last modification */ 
      time_t st_ctime; /* time of last status change */ 
}; 
1

Я лично использую функцию от stat семьи, как это. Также обратите внимание, что int может быть слишком малым для возвращаемого значения (особенно в 32-битных системах); off_t гарантированно работает.

off_t filesize(FILE *handle) { 
    struct stat statbuf; 
    if (fstat(fileno(handle), &statbuf) != 0) { 
     // handle an error 
    } else { 
     return statbuf.st_size; 
    } 
} 

Отметим также, что это может быть легко переделаны, чтобы работать для файлов, которые еще не открыты, используя стандартный stat() вместо fstat().

Смежные вопросы