https://gcc.gnu.org/bugzilla/show_bug.cgi?id=118003
--- Comment #3 from Jonathan Wakely <redi at gcc dot gnu.org> --- Changing directory does work: --- a/libstdc++-v3/src/c++17/fs_ops.cc +++ b/libstdc++-v3/src/c++17/fs_ops.cc @@ -1327,8 +1327,22 @@ fs::remove(const path& p, error_code& ec) noexcept std::uintmax_t fs::remove_all(const path& p) { - error_code ec; uintmax_t count = 0; +#if _GLIBCXX_FILESYSTEM_IS_WINDOWS + if (is_directory(p)) + { + struct Guard + { + fs::path cwd = fs::current_path(); + ~Guard() { fs::current_path(cwd); } + } g; + fs::current_path(p); + directory_iterator end; + for (directory_iterator dir(L"."); dir != end; ++dir) + count += fs::remove_all(*dir); + } +#else + error_code ec; recursive_directory_iterator dir(p, directory_options{64|128}, ec); switch (ec.value()) // N.B. assumes ec.category() == std::generic_category() { @@ -1363,6 +1377,7 @@ fs::remove_all(const path& p) // An error occurred. _GLIBCXX_THROW_OR_ABORT(filesystem_error("cannot remove all", p, ec)); } +#endif // Remove p itself, which is either a non-directory or is now empty. return count + fs::remove(p); @@ -1372,6 +1387,22 @@ std::uintmax_t fs::remove_all(const path& p, error_code& ec) { uintmax_t count = 0; +#if _GLIBCXX_FILESYSTEM_IS_WINDOWS + if (is_directory(p, ec)) + { + struct Guard + { + fs::path cwd = fs::current_path(); + ~Guard() { fs::current_path(cwd); } + } g; + fs::current_path(p); + directory_iterator end; + for (directory_iterator dir(L".", ec); !ec && dir != end; dir.increment(ec)) + count += fs::remove_all(*dir, ec); + } + else if (ec) + return -1; +#else recursive_directory_iterator dir(p, directory_options{64|128}, ec); switch (ec.value()) // N.B. assumes ec.category() == std::generic_category() { @@ -1409,6 +1440,7 @@ fs::remove_all(const path& p, error_code& ec) // An error occurred. return -1; } +#endif // Remove p itself, which is either a non-directory or is now empty. if (int last = fs::remove(p, ec); !ec)