Отпечатване на размер на файл off_t от dirent struct

Всичко, което искам, е да отпечатам размера на файла в байтове, който използвам

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 структура.


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 man:

Само полетата 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?

person Andrey Mishchenko    schedule 11.12.2013