[Bug libstdc++/71313] New: [Filesystem TS] remove_all fails to remove directory contents recursively
felix.morgner at gmail dot com
gcc-bugzilla@gcc.gnu.org
Fri May 27 17:00:00 GMT 2016
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71313
Bug ID: 71313
Summary: [Filesystem TS] remove_all fails to remove directory
contents recursively
Product: gcc
Version: 6.1.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: libstdc++
Assignee: unassigned at gcc dot gnu.org
Reporter: felix.morgner at gmail dot com
Target Milestone: ---
Created attachment 38583
--> https://gcc.gnu.org/bugzilla/attachment.cgi?id=38583&action=edit
Sample code to reproduce the problem
According to the Filesystem TS [fs.op.remove_all], remove_all should
recursively remove the contents of the given file.
From the final draft:
...
Recursively deletes the contents of p if it exists, then deletes file p
itself, as if by POSIX remove().
...
The current implementation in libstdc++-v3 (libstdc++fs) fails to do so.
The following code:
#include <experimental/filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::experimental::filesystem;
int main() try
{
auto const kDirectory = fs::path("dtop");
create_directory(kDirectory);
create_directory(kDirectory / "dsub");
std::ofstream out{kDirectory / "dsub" / "file"};
out.close();
fs::remove_all(kDirectory);
}
catch(fs::filesystem_error const & e)
{
std::cout << "Error: " << e.what() << '\n';
}
produces the following output:
Error: filesystem error: cannot remove all: Directory not empty [dtop]
I assume that the bug is caused by 4 missing characters in 'filesystem/ops.cc'.
From the current HEAD:
std::uintmax_t
fs::remove_all(const path& p, error_code& ec) noexcept
{
auto fs = symlink_status(p, ec);
uintmax_t count = 0;
if (ec.value() == 0 && fs.type() == file_type::directory)
for (directory_iterator d(p, ec), end; ec.value() == 0 && d != end;
++d)
count += fs::remove(d->path(), ec);
if (ec.value())
return -1;
return fs::remove(p, ec) ? ++count : -1; // fs:remove() calls ec.clear()
}
I believe that the line
count += fs::remove(d->path(), ec);
should really be
count += fs::remove_all(d->path(), ec);
More information about the Gcc-bugs
mailing list