home | help
std::filesy...::space_info(3)  C++ Standard Libary std::filesy...::space_info(3)

NAME
     std::filesystem::space_info - std::filesystem::space_info

Synopsis
	Defined in header <filesystem>
	struct space_info {

	    std::uintmax_t capacity;
	    std::uintmax_t free;	(since C++17)
	    std::uintmax_t available;

	};

	Represents   the   filesystem  information  as	determined  by	filesys-
     tem::space.

Member objects
	capacity  total size of the filesystem, in bytes
		  (public member object)
	free	  free space on the filesystem, in bytes
		  (public member object)
		  free space available to a non-privileged process (may be equal
     or less
	available than free)
		  (public member object)

Non-member functions
	operator== compares two space_infos
	(C++20)    (function)

     operator==(std::filesystem::space_info)

	friend	bool  operator==(  const  space_info&,	const  space_info&  )  =
     (since C++20)
	default;

	Checks	if  capacity, free and available of both arguments are equal re-
     spectively.

	This function is  not  visible	to  ordinary  unqualified  or  qualified
     lookup, and can
	only   be   found   by	 argument-dependent  lookup  when  std::filesys-
     tem::space_info is an
	associated class of the arguments.

	The != operator is synthesized from operator==.

Example
     // Run this code

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

      std::uintmax_t disk_usage_percent(const std::filesystem::space_info& si,
					bool is_privileged = false) noexcept
      {
	  if (constexpr std::uintmax_t X(-1);
	      si.capacity == 0 || si.free == 0 || si.available == 0 ||
	      si.capacity == X || si.free == X || si.available == X
	  )
	      return 100;

	  std::uintmax_t unused_space = si.free, capacity = si.capacity;
	  if (!is_privileged)
	  {
	      const std::uintmax_t privileged_only_space = si.free  -  si.avail-
     able;
	      unused_space -= privileged_only_space;
	      capacity -= privileged_only_space;
	  }
	  const std::uintmax_t used_space{capacity - unused_space};
	  return 100 * used_space / capacity;
      }

      void print_disk_space_info(auto const& dirs, int width = 14)
      {
	  (std::cout << std::left).imbue(std::locale("en_US.UTF-8"));

	  for (const auto s : {"Capacity", "Free", "Available", "Use%", "Dir"})
	      std::cout << "a " << std::setw(width) << s << ' ';

	  for (std::cout << '\n'; auto const& dir : dirs)
	  {
	      std::error_code ec;
	      const std::filesystem::space_info si = std::filesystem::space(dir,
     ec);
	      for (auto x : {si.capacity, si.free, si.available, disk_usage_per-
     cent(si)})
		  std::cout << "a " << std::setw(width) << static_cast<std::int-
     max_t>(x) << ' ';
	      std::cout << "a " << dir << '\n';
	  }
      }

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

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

See also
	space	determines available free space on the file system
	(C++17) (function)

http://cppreference.com 	   2024.06.10	   std::filesy...::space_info(3)

home | help