Печать размера файла off_t из прямой структуры

Все, что я хочу, это напечатать размер файла в байтах, которые я использую

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() с использованием статистической структуры.


person Antifa    schedule 11.12.2013    source источник


Ответы (2)


Как указывает @Andrey, значение d_off не всегда полезно или даже присутствует. Например, в OSX его нет. Вместо этого используйте вызов stat.

person Sean Perry    schedule 11.12.2013
comment
Вы имеете право @sean-perry ,@andrey. Я использовал lstat() вместо stat!!! Это сработало хорошо - person Antifa; 12.12.2013
comment
Рад это слышать @KonKost. Обратите внимание, что вы также должны проверить тип файла в файле dirent. В противном случае вы будете вызывать stat для каталогов, FIFO и черт знает чего еще. - person Sean Perry; 12.12.2013

На справочной странице readdir:

В POSIX.1-2001 указаны только поля d_name и d_ino. Остальные поля доступны во многих, но не во всех системах. В 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?

person Andrey Mishchenko    schedule 11.12.2013