Как получить общее доступное дисковое пространство в системах Posix?

Я пишу кроссплатформенное приложение, и мне нужно все доступное дисковое пространство. Для систем posix (Linux и Macos) я использую statvfs. Я создал этот метод C ++:

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;
   }
}

К сожалению, я получаю довольно странные значения, которые я не могу понять. Например: и мне нужно общее доступное дисковое пространство. Для систем posix (Linux и Macos) я использую statvfs. Я создал этот метод C ++:

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;
   }
}

К сожалению, я получаю довольно странные значения, которые я не могу понять. Например: и мне нужно общее доступное дисковое пространство. Для систем posix (Linux и Macos) я использую statvfs. Я создал этот метод C ++:

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;
   }
}

К сожалению, я получаю довольно странные значения, которые я не могу понять. Например: f_blocks = 73242188 f_bsize = 1048576 f_bfree = 50393643 ...

Это значения в битах, байтах или еще чем-нибудь? Я читал здесь, в stackoverflow, это должны быть байты, но тогда я бы получил общее количество свободных байтов: f_bsize * f_bfree = 1048576 * 50393643 но это означает 49212,542 ГБ ... слишком много ...

Я что-то не так делаю с кодом или что-то еще? Спасибо!

6
задан Luca Carlon 10 October 2010 в 10:18
поделиться