boost :: filesystem :: space () сообщает о неправильном дисковом пространстве - PullRequest
1 голос
/ 08 июля 2019

На диске свободно 430 ГБ C:.Но для этой программы:

#include <iostream>
#include <boost/filesystem.hpp>

int main()
{
    boost::filesystem::path p("C:");

    std::size_t freeSpace = boost::filesystem::space(p).free;
    std::cout<<freeSpace << " Bytes" <<std::endl;
    std::cout<<freeSpace / (1 << 20) << " MB"<<std::endl;

    std::size_t availableSpace = boost::filesystem::space(p).available;
    std::cout << availableSpace << " Bytes" <<std::endl;
    std::cout << availableSpace / (1 << 20) << " MB"<<std::endl;

    std::size_t totalSpace = boost::filesystem::space(p).capacity;
    std::cout << totalSpace << " Bytes" <<std::endl;
    std::cout << totalSpace / (1 << 20) << " MB"<<std::endl;

    return 0;
}

Вывод:

2542768128 Bytes
2424 MB
2542768128 Bytes
2424 MB
2830102528 Bytes
2698 MB

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

Я использую mingw в Windows:

g++ (i686-posix-dwarf-rev2, Built by MinGW-W64 project) 7.1.0

Я также пытался использовать MXE для кросс-компиляции из Linux:

i686-w64-mingw32.static-g++ (GCC) 5.5.0

Оба возвращают одинаковые номера.

Ответы [ 2 ]

2 голосов
/ 08 июля 2019

std::size_t не гарантируется как самый большой стандартный тип без знака. На самом деле, это редко.

А boost::filesystem определяет space_info таким образом :

struct space_info  // returned by space function
{
  uintmax_t capacity;
  uintmax_t free; 
  uintmax_t available; // free space available to a non-privileged process
};

Вы бы легко избежали ошибки, используя auto, что было бы естественно, так как точный тип не имеет никакого значения. Почти всегда только несоответствие причиняет боль, таким образом Почти всегда auto.

2 голосов
/ 08 июля 2019

Используйте тип, который требуется boost::filesystem::space(p).free. может потребоваться 64-битное целое число:

uintmax_t freeSpace = boost::filesystem::space(p).free;

использование auto тоже хорошо.

...