提问人:Christopher Ambarchian 提问时间:4/5/2022 更新时间:4/5/2022 访问量:2075
std::filesystem::copy 将文件复制到另一个预先存在的目录时出错
Error with std::filesystem::copy copying a file to another pre-existing directory
问:
请参阅下面的代码,以及下面的错误。
std::string source = "C:\\Users\\cambarchian\\Documents\\tested";
std::string destination = "C:\\Users\\cambarchian\\Documents\\tester";
std::filesystem::path sourcepath = source;
std::filesystem::path destpath = destination;
std::filesystem::copy_options::update_existing;
std::filesystem::copy(sourcepath, destpath);
terminate called after throwing an instance of 'std::filesystem::__cxx11::filesystem_error'
what(): filesystem error: cannot copy: File exists [C:\Users\cambarchian\Documents\tested] [C:\Users\cambarchian\Documents\tester]
尝试使用 filesystem::copy,并尝试不同的路径。没有任何运气。我不能在这里写太多,因为上面列出了问题,可能是一个简单的格式问题。话虽如此,它使用 Visual Studio 2022 在我的家用计算机上工作,但是将 VS Code 与 gcc 11.2 一起使用给我带来了这个问题。
答:
使用:filesystem::copy_file(oldPath, newPath, filesystem::copy_options::overwrite_existing);
记录了 std::filesystem::copy
的重载。您正在使用第一个重载,但需要第二个重载:
void copy(from, to)
这相当于 [重载 2, 下面] 使用copy_options::none
void copy(from, to, options)
在调用 copy 之前编写语句根本没有实现任何目标,而将选项传递给正确的重载,例如std::filesystem::copy_options::update_existing;
std::filesystem::copy(sourcepath, destpath,
std::filesystem::copy_options::update_existing);
应该做你想做的事。
...它使用 Visual Studio 2022 在我的家用计算机上工作......
在这种情况下,您不会说目标文件是否存在,这是您应该检查的第一件事。
我把copy_options放在复制函数中,但它不起作用,所以我开始移动它,我可能应该提到这一点。
随机排列代码并不是生成干净示例供其他人帮助的好方法。
在极少数情况下,黑客攻击确实可以解决它,我强烈建议您暂停一下以找出原因。当你已经破解了某些东西,但它仍然不起作用时,一定要发表评论以提醒自己你尝试了什么,但代码本身应该仍然处于良好状态。
我写的时候还是不工作
std::filesystem::copy(sourcepath, destpath, std::filesystem::copy_options::recursive)
嗯,这是一个不同的选择,不是吗?你是否也随机排列了你选择的?copy_options
尝试递归和update_existing会产生相同的问题。
文档说
如果 (即使在组中)存在任何copy_options选项组中存在多个选项,则行为未定义。
options
copy_file
所以你无论如何都不应该同时设置两者。以递归方式复制单个文件没有任何好处,但更新或覆盖一个文件可能会有好处。如果目标已存在。根据您的错误,确实如此。
由于您确实有一个明确指出“文件存在”的错误,因此您当然应该查看此处表格的“当文件已存在时控制 copy_file()
的选项”部分。
Visual Studio 2022 修复了该问题
评论
std::filesystem::copy_options::update_existing;
copy
copy(sourcepath, destpath, options)
recursive
?你不想要吗?std::filesystem::copy(sourcepath, destpath, std::filesystem::copy_options::update_existing);