Piszę aplikację wieloplatformową i potrzebuję całkowitego dostępnego miejsca na dysku. W systemach posix (Linux i MacOS) używam statvfs. Stworzyłem tę metodę C++:Jak uzyskać całkowitą dostępną przestrzeń dyskową w systemach Posix?
long OSSpecificPosix::getFreeDiskSpace(const char* absoluteFilePath) {
struct statvfs buf;
if (!statvfs(absoluteFilePath, &buf)) {
unsigned long blksize, blocks, freeblks, disk_size, used, free;
blksize = buf.f_bsize;
blocks = buf.f_blocks;
freeblks = buf.f_bfree;
disk_size = blocks*blksize;
free = freeblks*blksize;
used = disk_size - free;
return free;
}
else {
return -1;
}
}
Niestety, otrzymuję dość dziwne wartości, których nie mogę zrozumieć. Na przykład: f_blocks = 73242188 = 1048576 f_bsize f_bfree = 50393643 ...
Czy te wartości w bitów, bajtów lub cokolwiek innego? Czytałem tutaj na stackoverflow te powinny być bajtów, ale chciałbym uzyskać całkowitą liczbę bajtów wolnych jest: f_bsize * f_bfree = 1048576 * 50393643 ale to oznacza 49212.542GB ... zbyt dużo ...
Am Robię coś nie tak z kodem lub cokolwiek innego? Dzięki!
Jaki system plików używasz, który ma rozmiar bloku 1048576? –
To jest Mac OS Extended (Case-Sensitive, Journaled). Obecnie pracuję na Macu, ale, o ile mogę to zrozumieć, to ma działać. –
Poza dziwactwem rozmiaru bloku i rzekomego napędu o pojemności 70 TB - należy pamiętać, że "długi" na 32-bitowym OSX ma tylko 32 bity. Nawet jeśli masz odpowiednie liczby, prawdopodobnie jest to wystarczająco duża liczba * bloków *, ale nie jest wystarczająco duża dla liczby * bajtów *. Napędy o pojemności 4 GB są łatwo dostępne u wyspecjalizowanych dostawców ;-) –