# std::filesystem::space

From cppreference.com
< cpp‎ | filesystem

Defined in header `<filesystem>` |  |
std::filesystem::space_info space( const std::filesystem::path& p ); std::filesystem::space_info space( const std::filesystem::path& p, std::error_code& ec ) noexcept; |  | (since C++17)

Determines the information about the filesystem on which the pathname `p` is located, as if by POSIX `statvfs`.

Populates and returns an object of type `filesystem::space_info`, set from the members of the POSIX `struct statvfs` as follows

- `space_info.capacity` is set as if by f_blocks*f_frsize
- `space_info.free` is set to f_bfree*f_frsize
- `space_info.available` is set to f_bavail*f_frsize
- Any member that could not be determined is set to static_cast<std::uintmax_t>(-1)

The non-throwing overload sets all members to static_cast<std::uintmax_t>(-1) on error.

### Parameters

p | - | path to examine
ec | - | out-parameter for error reporting in the non-throwing overload.

### Return value

The filesystem information (a `filesystem::space_info` object).

### Exceptions

The overload that does not take a std::error_code& parameter throws `filesystem::filesystem_error` on underlying OS API errors, constructed with `p` as the first path argument and the OS error code as the error code argument. The overload taking a std::error_code& parameter sets it to the OS API error code if an OS API call fails, and executes ec.clear() if no errors occur. Any overload not marked `noexcept` may throw std::bad_alloc if memory allocation fails.

### Notes

`space_info.available` may be less than `space_info.free`.

### Example

Run this code

    #include <iostream>
    #include <filesystem>
    #include <cstdint>

    void print_space_info(auto const& dirs, int width = 15)
    {
        (std::cout << std::left).imbue(std::locale("en_US.UTF-8"));
        for (const auto s : {"Capacity", "Free", "Available", "Dir"})
            std::cout << "│ " << std::setw(width) << s << ' ';
        std::cout << '\n';
        std::error_code ec;
        for (auto const& dir : dirs) {
            const std::filesystem::space_info si = std::filesystem::space(dir, ec);
            std::cout
                << "│ " << std::setw(width) << static_cast<std::intmax_t>(si.capacity) << ' '
                << "│ " << std::setw(width) << static_cast<std::intmax_t>(si.free) << ' '
                << "│ " << std::setw(width) << static_cast<std::intmax_t>(si.available) << ' '
                << "│ " << dir << '\n';
        }
    }

    int main()
    {
        const auto dirs = { "/dev/null", "/tmp", "/home", "/null" };
        print_space_info(dirs);
    }

Possible output:

    │ Capacity        │ Free            │ Available       │ Dir
    │ 84,417,331,200  │ 24,069,705,728  │ 21,492,748,288  │ /dev/null
    │ 84,417,331,200  │ 24,069,705,728  │ 21,492,748,288  │ /tmp
    │ 250,321,567,744 │ 37,623,181,312  │ 25,152,159,744  │ /home
    │ -1              │ -1              │ -1              │ /null

### See also

space_info (C++17) | information about free and available space on the filesystem (class)

Retrieved from "https://en.cppreference.com/mwiki/index.php?title=cpp/filesystem/space&oldid=144494"