std::filesystem::space - cppreference.com

From cppreference.com

Defined in header

<filesystem>

std::filesystem::space_infospace(conststd::filesystem::path&p); (1) (since C++17)std::filesystem::space_infospace(conststd::filesystem::path&p,std::error_code&ec)noexcept; (2) (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 structstatvfs 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

Any overload not marked noexcept may throw

std::bad_alloc

if memory allocation fails.

1) Throws

std::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.

2) Sets a std::error_code& parameter to the OS API error code if an OS API call fails, and executes ec.

clear

() if no errors occur.

Notes

space_info.available

may be less than

space_info.free

.

Example

Run this code

#include<cstdint>#include<filesystem>#include<iostream>#include<locale>std::uintmax_tdisk_usage_percent(conststd::filesystem::space_info&si,boolis_privileged=false)noexcept{if(constexprstd::uintmax_tX(-1);si.capacity==0||si.free==0||si.available==0||si.capacity==X||si.free==X||si.available==X)return100;std::uintmax_tunused_space=si.free,capacity=si.capacity;if(!is_privileged){conststd::uintmax_tprivileged_only_space=si.free-si.available;unused_space-=privileged_only_space;capacity-=privileged_only_space;}conststd::uintmax_tused_space{capacity-unused_space};return100*used_space/capacity;}voidprint_disk_space_info(autoconst&dirs,intwidth=14){(std::cout<<std::left).imbue(std::locale("en_US.UTF-8"));for(constautos:{"Capacity","Free","Available","Use%","Dir"})std::cout<<"│ "<<std::setw(width)<<s<<' ';for(std::cout<<'\n';autoconst&dir:dirs){std::error_codeec;conststd::filesystem::space_infosi=std::filesystem::space(dir,ec);for(autox:{si.capacity,si.free,si.available,disk_usage_percent(si)})std::cout<<"│ "<<std::setw(width)<<static_cast<std::intmax_t>(x)<<' ';std::cout<<"│ "<<dir<<'\n';}}intmain(){constautodirs={"/dev/null","/tmp","/home","/proc","/null"};print_disk_space_info(dirs);}Possible output:

│ Capacity │ Free │ Available │ Use% │ Dir │ 84,417,331,200 │ 42,732,986,368 │ 40,156,028,928 │ 50 │ /dev/null │ 84,417,331,200 │ 42,732,986,368 │ 40,156,028,928 │ 50 │ /tmp │ -1 │ -1 │ -1 │ 100 │ /home │ 0 │ 0 │ 0 │ 100 │ /proc │ -1 │ -1 │ -1 │ 100 │ /null See also

(C++17)

information about free and available space on the filesystem
(class)

[edit]