URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID1
Нить номер: 81631
[ Назад ]

Исходное сообщение
"Свободное место на НЖМД в linux (sys/statfs)"

Отправлено demiurg , 20-Авг-08 14:10 
Здравствуйте!

Пытаюсь с помощью statfs получить информацию о свободном месте на файловой системе.

Код такой:
#include <sys/statfs.h>
struct statfs diskFree;
statfs ( diskPartition, &diskFree );
value = diskFree.f_bsize * diskFree.f_bavail;

Переменная diskPartition - путь до смонтированной файловой системы;
Переменная value - возвращенное количество байт свободного места;
Проблема в том что на корневом разделе место определяется правильно (сам раздел 5 гигов, свободного места - 900 мегабайт), но на большом разделе (20 гигабайт) место определяется неправильно (вместо 12 гигабайт возврашается 4 гигабайта).

Подскажите че делать?
Или придется тупо вывод команды df отрабатывать...


Содержание

Сообщения в этом обсуждении
"Свободное место на НЖМД в linux (sys/statfs)"
Отправлено Pahanivo , 20-Авг-08 14:48 
>Подскажите че делать?
>Или придется тупо вывод команды df отрабатывать...

дак мож собственно код df глянуть?
и не изобретать велосипед )))


"Свободное место на НЖМД в linux (sys/statfs)"
Отправлено mikra , 20-Авг-08 16:25 
>[оверквотинг удален]
>
>Переменная diskPartition - путь до смонтированной файловой системы;
>Переменная value - возвращенное количество байт свободного места;
>Проблема в том что на корневом разделе место определяется правильно (сам раздел
>5 гигов, свободного места - 900 мегабайт), но на большом разделе
>(20 гигабайт) место определяется неправильно (вместо 12 гигабайт возврашается 4 гигабайта).
>
>
>Подскажите че делать?
>Или придется тупо вывод команды df отрабатывать...

Товарищ, ты пытаешься не свободное место, а моток колючей проволоки получить от скрещивания ежа с ужом :)

long    f_bsize;    /* optimal transfer block size */

"оптимал трансфер блок сайз" это не тоже самое, что "блок сайз"

Про statvfs читай. И вообще, не принебрегай разделом "see also"


"Свободное место на НЖМД в linux (sys/statfs)"
Отправлено demiurg , 24-Авг-08 13:12 
Фух... вроде разобрался...

Вот код:

#include <sys/statvfs.h>
struct statvfs diskFree;
statvfs ( diskPartition, &diskFree );
/*        cout << "f_bfree = " << diskFree.f_bfree << endl;
        cout << "f_bavail = " << diskFree.f_bavail << endl;
        cout << "f_bsize = " << diskFree.f_bsize << endl;
        cout << "f_files = " << diskFree.f_files << endl;
        cout << "f_blocks = " << diskFree.f_blocks << endl;*/
value = int(double(diskFree.f_bavail) * double(diskFree.f_bsize)/1024.0/1024.0);

Основная проблема была в том, что я забыл о преобразовании типов. Я и до вышеуказанных советов пытался использовать statvfs, но результаты вызывали легкий шок. А все просто если делишь что-то на что-то надо не забывать преобразовывать типы данных (как double в мое примере).
Всем спасибо большое... тема закрыта...