std::filesystem::copy 将文件复制到另一个预先存在的目录时出错

Error with std::filesystem::copy copying a file to another pre-existing directory

提问人:Christopher Ambarchian 提问时间:4/5/2022 更新时间:4/5/2022 访问量:2075

问:

请参阅下面的代码,以及下面的错误。

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 一起使用给我带来了这个问题。

C++ 文件 gcc std 文件系统

评论

3赞 molbdnilo 4/5/2022
该表达式不起作用,一个合理的编译器会警告您这一点。您需要 的另一个重载 。std::filesystem::copy_options::update_existing;copy
1赞 463035818_is_not_an_ai 4/5/2022
我想你的意思是打电话给.投票以错别字结束copy(sourcepath, destpath, options)
0赞 Christopher Ambarchian 4/5/2022
我把copy_options放在复制函数中,但它不起作用,所以我开始移动它,我可能应该提到这一点。当我写 std::filesystem::copy(sourcepath, destpath, std::filesystem::copy_options::recursive) 时仍然不起作用;
0赞 463035818_is_not_an_ai 4/5/2022
recursive?你不想要吗?std::filesystem::copy(sourcepath, destpath, std::filesystem::copy_options::update_existing);
1赞 molbdnilo 4/5/2022
随意移动不工作的东西,希望偶然发现有用的东西,是解决问题最不有效的方法之一。

答:

0赞 kaaleksandr 4/5/2022 #1

使用:filesystem::copy_file(oldPath, newPath, filesystem::copy_options::overwrite_existing);

0赞 Useless 4/5/2022 #2

记录了 std::filesystem::copy 的重载。您正在使用第一个重载,但需要第二个重载:

  1. void copy(from, to)这相当于 [重载 2, 下面] 使用copy_options::none
  2. 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选项组中存在多个选项,则行为未定义。optionscopy_file

所以你无论如何都不应该同时设置两者。以递归方式复制单个文件没有任何好处,但更新或覆盖一个文件可能会有好处。如果目标已存在。根据您的错误,确实如此。

由于您确实有一个明确指出“文件存在”的错误,因此您当然应该查看此处表格的“当文件已存在时控制 copy_file() 的选项”部分。

0赞 Christopher Ambarchian 4/5/2022 #3

Visual Studio 2022 修复了该问题

评论

0赞 Community 4/6/2022
您的答案可以通过其他支持信息进行改进。请编辑以添加更多详细信息,例如引文或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何写出好答案的更多信息。