我正在尝试熟悉c++ 17的文件系统库,我正在尝试实现函数
bool MoveFolder(std::string_view oldRelativePath, std::string_view newRelativePath)
将把位于oldRelativePath
的文件夹移到newRelativePath
下。我已经摆弄了一个小时了,但没有运气。如何用std::filesystem
实现这个功能?对于任何错误,我希望返回false。
您当然使用std::filesystem::rename。
将由old_p标识的文件系统对象移动或重命名为new_p,就像通过POSIX重命名一样。
好的,我发现了我之前使用std::filesystem::rename
的方法的问题。重命名,顾名思义,重命名。它不动。我试着这样使用它:
fs::path p = fs::current_path() / "sandbox";
fs::create_directories(p / "from");
std::ofstream(p / "from/file1.txt").put('a');
fs::create_directory(p / "to");
fs::rename(p / "from", p / "to"); // NOT-OK
fs::remove_all(p);
这将导致from
被重命名为to
,它实际上不会将from
移动到to
下,这正是我想要做的。这里有一个简单的方法:
fs::path p = fs::current_path() / "sandbox";
fs::create_directories(p / "from");
std::ofstream(p / "from/file1.txt").put('a');
fs::create_directory(p / "to");
fs::path ppp(p/"from");
fs::rename(p / "from", p / "to" / ppp.filename()); // OK
fs::remove_all(p);
这是我一直拼命想实现的功能…
bool MoveFolder(std::string_view oldRelativePath, std::string_view newRelativePath) {
fs::path old(oldRelativePath);
fs::path neww(newRelativePath);
std::error_code err;
fs::rename(old, old / neww.filename(), err);
return !static_cast<bool>(err);
}