Вы должны включить правильный заголовок:
#incude <sys/stat.h>
Это объявляет структуру и связанные функции.
Обратите внимание, что stat()
возвращает ноль в случае успеха, поэтому ваш тест нуждается в изменении (и, как указал @jsmchmier в комментарии, при вызове stat следует использовать dirp->d_name
вместо строкового литерала "."
). Кроме того, st_blksize
- это размер блоков диска, а не размер файла, то есть st_size
(измеряется в байтах).
POSIX говорит:
off_t st_size
Для обычных файлов размер файла в байтах.
Для символических ссылок длина в байтах
путь содержится в символической ссылке.
blksize_t st_blksize
Предпочтительный размер блока ввода-вывода для конкретной файловой системы
для этого объекта. В некоторых типах файловых систем это
может варьироваться от файла к файлу.
blkcnt_t st_blocks
Количество блоков, выделенных для этого объекта.
Обратите внимание, что старые (очень старые) версии Unix не поддерживали st_blksize
или st_blocks
. Я ожидаю, что большинство текущих версий делают.
Теперь он выдает предупреждение ... предупреждение: формат "% d" ожидает тип "int", но аргумент 2 имеет тип "__blksize_t"
Скорее всего, __blksize_t
является целым типом без целочисленного значения, похожим на size_t
. Я бы, наверное, использовал простое приведение:
printf("Block size = %d\n", (int)buf.st_blksize);
В качестве альтернативы, если у вас есть C99, вы можете использовать средства с <inttypes.h>
, чтобы использовать больший размер:
printf("Block size = %" PRIu64 "\n", (uint64_t)buf.st_blksize);
На практике это излишне; размер блока вряд ли превысит 2 ГБ в этом десятилетии, поэтому int
, вероятно, будет достаточно в обозримом будущем.