Печать размера файла 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?

Другие вопросы по тегам