У меня проблема с программой, которая должна вернуть мне свободное место на диске, используемое любым пользователем.
Моя цель — получить все свободное дисковое пространство на всех разделах моего жесткого диска, которое будет доступно любому, у кого нет прав 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% /
Кажется, что правильное значение — это размер фрагмента, а не размер блока (т.е. f_frsize)
Вы пробовали с
diskData.f_bavail * diskData.f_frsize
вместо?
Это выглядит как более точный показатель свободного места на диске:
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