Печать размера файла off_t из структуры dirent
Все, что я хочу, это напечатать размер файла в байтах, которые я использую
DIR *d;
struct dirent *dir;
d= opendir(absolute_path);
while((dir= readdir(d))!=NULL){
printf("%s\t %d\t %u\n",dir->d_name,dir->d_type,(int long long )dir->d_off);
}
Печать d_off, который является типом off_t
неправильно. Для файла 323,388 bytes
это печатает 1296623584
Я думаю, что кастинг это проблема. Я пробовал много отливок, таких как %d
, %s
,%u
, %llu
... Что такое правильный кастинг?
РЕДАКТИРОВАТЬ: правильная функция, чтобы использовать, чтобы найти размер файла lstat()
используя структуру stat.
2 ответа
Как указывает @Andrey, значение d_off не всегда полезно или даже присутствует. Например, в OSX его нет. Используйте звонок для stat
вместо.
От readdir
справочная страница:
Только поля d_name и d_ino указаны в POSIX.1-2001. Остальные поля доступны во многих, но не во всех системах. В glibc программы могут проверять наличие полей, не определенных в POSIX.1, проверяя, определены ли макросы _DIRENT_HAVE_D_NAMLEN, _DIRENT_HAVE_D_RECLEN, _DIRENT_HAVE_D_OFF или _DIRENT_HAVE_D_TYPE.
Значение, возвращаемое в d_off, такое же, как и при вызове telldir(3) в текущей позиции в потоке каталога. Имейте в виду, что, несмотря на свой тип и имя, поле d_off редко является каким-либо видом смещения каталога в современных файловых системах. Приложения должны рассматривать это поле как непрозрачное значение, не делая никаких предположений относительно его содержимого; см. также Telldir(3).
Чтобы узнать размер файла, см. Раздел Как определить размер файла в C?