LINUX.ORG.RU

Проблема с структурой stat


0

0

Добрый день! Пытаюсь узнать размер файла struct stat st; stat(_Pass_,&st); printf(«%llu\n», st.st_size);

В ответ вместо нужного 1Gb - 4096b. Размер 1го файла превышает 700mb.

Как решить проблему?

Заранее спасибо!


Не распарсил:

В ответ вместо нужного 1Gb - 4096b. Размер 1го файла превышает 700mb.

При чём тут 700 Мбайт?

mky ★★★★★
()
Ответ на: комментарий от undet

прошу прощения, задача включает в себя знание размера директории. вроде как размер файлов в отдельности выводит верно. но перебирать все файлы, суммируя размер..надеюсь есть альтернативный вариант

sort
() автор топика
Ответ на: комментарий от sort

задача включает в себя знание размера директории

А какой смысл вам знать размер директории? Он зависит только от количества файлов, которые в ней находятся. Если же хотите узнать объем информации, хранящейся в этой директории, или проходите по ней рекурсивно (получите суммарный объем хранящихся в ней файлов) или смотрите исходники du, чтобы вычислить занимаемое содержимым директории место на диске.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Boy_from_Jungle

я думаю проблема связана с тем, что размер файла не помещается в предоставленном поле st_size

Это как?!

Элементарно: человек считает, что размер файла директории равен суммарному размеру хранящихся в ней файлов :)

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от sort

Как вам уже написали, каталог на диске занимает место, в котором хранятся имена файлов (только имена), поэтому 4 кбайта это правильно. Будет больше число файлов, будет больше килобайт. А с размером файлов это не связано.

Для вашей задачи нужно просуммировать размеры всех файлов. Но, у одного файла может быть много имён (жёстких ссылок), при этом место на диске он занимает только один раз.

mky ★★★★★
()
Ответ на: комментарий от sort

> размер файла не помещается в предоставленном поле st_size

Это вряд ли. Даже в 32-битном Линкусе размер off_t 64 бита.

akk ★★★★★
()
Ответ на: комментарий от akk

> размер off_t 64 бита.

off_t знаковый тип, поэтому для размера файла актуальны 63 бита.

akk ★★★★★
()
Ответ на: комментарий от akk

Даже в 32-битном Линкусе размер off_t 64 бита.

Только если принудительно указать

#define _FILE_OFFSET_BITS 64
#define _LARGEFILE64_SOURCE
Иначе - 32 бита (проверено, мне для работы с самопальной БД нужна была поддержка файлов с размером > 2Гб, т.е. нужна была 64-битная адресация. Без указанных define'ов ничего не работало).

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Eddy_Em

Только если принудительно указать

у меня вообще-то было вот так (дефайнил prinf префикс для off_t):

#if (defined(__USE_FILE_OFFSET64) || _FILE_OFFSET_BITS == 64 || __WORDSIZE == 64)
#define PRI_off_t(c) __PRI64_PREFIX c
#else
#define PRI_off_t(c) c
#endif
там были какие-то косяки при компиляции на разные архитектуры.

xydo ★★
()
Ответ на: комментарий от xydo

>на разные архитектуры
(вплоть до 64-битного ppc)

вроде был случай, что когда __WORDSIZE == 64, _FILE_OFFSET_BITS был вообще не задан.

xydo ★★
()
Ответ на: комментарий от xydo

впрочем, это если ты сам ловишь момент 64-битного off_t
если же тебе это нужно от компилятора, двух этих макросов достаточно.

xydo ★★
()

> struct stat st; stat(_Pass_,&st); printf(«%llu\n», st.st_size);

Надеюсь, код возврата stat ты проверяешь?

Manhunt ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.