Получите настоящее бесплатное полезное пространство

У меня проблема с программой, которая должна вернуть мне свободное место на диске, используемое любым пользователем.

Моя цель — получить все свободное дисковое пространство на всех разделах моего жесткого диска, которое будет доступно любому, у кого нет прав sudo.

Итак, я попробовал это:

int main() {
struct statvfs diskData;
statvfs("/", &diskData);
unsigned long long available = (diskData.f_favail + diskData.f_bavail) * diskData.f_frsize) / (1024 * 1024)
std::cout << "Free Space : " << available << std::endl;
}

Это дает мне в общей сложности 2810 …

Тем не менее, когда я вывожу df -hЯ могу прочитать, что свободное место 25G за sda3 а также 30G за sda1

Это кажется совершенно неточным.

Я работал над сообщениями в Stackoverflow, смешивая решения, которые видел, но ни одно из них не является удовлетворительным. Как я могу получить правильное значение в мегабайтах моего свободного места?

РЕДАКТИРОВАТЬ: Полный statvfs а также df / выход

statvfs :

Block Size            : 4 096
Fragment Size         : 4 096
Blocks                : 9 612 197
Free Blocks           : 7 009 166
Non Root Free Blocks  : 6 520 885
Inodes                : 2 444 624
Free Inodes Space     : 2 137 054
Non Root Free Inodes  : 2 137 054
File System ID        : 4 224 884 198
Mount Flags           : 4 096
Max Filename Length   : 255

df / :

Filesystem     1K-Blocks      Used           Available      Use%     Mounted on
/dev/sda3      38 448 788     10 412 112     26 083 556     29%      /

1

Решение

Кажется, что правильное значение — это размер фрагмента, а не размер блока (т.е. f_frsize)

Вы пробовали с

diskData.f_bavail * diskData.f_frsize

вместо?

1

Другие решения

Это выглядит как более точный показатель свободного места на диске:

unsigned long long available = (diskData.f_bavail * diskData.f_bsize) / (1024 * 1024);

Это соответствует выводу из df довольно тесно в моей системе (df показывает размеры в гигах и, возможно, округляет их).

Если вы хотите вывод в концертах, таких как df Вы можете использовать это:

#include <sys/statvfs.h>
#include <stdio.h>

unsigned long rounddiv(unsigned long num, unsigned long divisor) {
return (num + (divisor/2)) / divisor;
}

int main() {
struct statvfs diskData;
statvfs("/home", &diskData);
unsigned long available = diskData.f_bavail * diskData.f_bsize;
printf("Free Space : %luG\n", rounddiv(available, 1024*1024*1024));
return 0;
}

Выход из этого на моей системе:
Free Space : 31G

И если я бегу df -h /home:

Filesystem            Size  Used Avail Use% Mounted on
181G  141G   31G  83% /home
3

По вопросам рекламы [email protected]