Index: libcxx/src/filesystem/operations.cpp =================================================================== --- libcxx/src/filesystem/operations.cpp +++ libcxx/src/filesystem/operations.cpp @@ -1301,6 +1301,7 @@ space_info __space(const path& p, error_code* ec) { ErrorHandler err("space", ec, &p); space_info si; +#if !defined(_LIBCPP_WIN32API) struct statvfs m_svfs = {}; if (::statvfs(p.c_str(), &m_svfs) == -1) { err.report(capture_errno()); @@ -1316,6 +1317,34 @@ do_mult(si.capacity, m_svfs.f_blocks); do_mult(si.free, m_svfs.f_bfree); do_mult(si.available, m_svfs.f_bavail); +#else + ULARGE_INTEGER free_bytes_available_to_caller, total_number_of_bytes, + total_number_of_free_bytes; + path dir = p; + while (true) { + error_code local_ec; + const file_status st = status(dir, local_ec); + if (!exists(st) || is_directory(st)) + break; + path parent = dir.parent_path(); + if (parent == dir) { + err.report(make_error_code(errc::no_such_file_or_directory)); + si.capacity = si.free = si.available = static_cast(-1); + return si; + } + dir = parent; + } + if (!GetDiskFreeSpaceExW(dir.c_str(), &free_bytes_available_to_caller, + &total_number_of_bytes, + &total_number_of_free_bytes)) { + err.report(detail::make_windows_error(GetLastError())); + si.capacity = si.free = si.available = static_cast(-1); + return si; + } + si.capacity = total_number_of_bytes.QuadPart; + si.free = total_number_of_free_bytes.QuadPart; + si.available = free_bytes_available_to_caller.QuadPart; +#endif return si; }