copy_file何时真正返回false?

时间:2018-11-20 09:04:02

标签: c++ c++17

std::filesystem::copy_file的简单版本具有以下签名:

bool copy_file(const path& from, const path& to);

返回值描述为:

  

如果已复制文件,则为true,否则为false。

通常这很有意义,并且您希望使用if来包装调用,并在操作失败时报告错误,例如:

if (!fs::copy_file(inputImage, outputImage))
{
    LOG(error) << "Failed to copy file:" << inputImage << " ==> " << outputImage;
}

但是,如果您查看有关例外情况的文档:

  

不带std :: error_code&参数的重载会在底层OS API错误上引发filesystem_error,该错误由from作为第一个路径参数,to作为第二个路径参数,以及OS错误代码作为错误代码参数构造。

这使我想到一个问题:如果权限不足,文件锁定和其他文件系统错误等故障导致异常,那么简单的copy_file会在什么情况下返回false

2 个答案:

答案 0 :(得分:3)

原因是copy_file(a,b)只是copy_file(a,b,copy_options::none)的重载,它将始终返回true 引发异常。但是当您使用copy_file(a,b,copy_options::skip_existing)时,您也可以毫无例外地收到有效的false,因此您知道目标文件已经存在。

答案 1 :(得分:1)

您有两种方法来处理filesystem中的错误。这基本上是从boost继承的。您可以将错误放入该error_code引用中,也可以从异常中排除错误。

基本上,保证有参数的版本不会抛出错误,而没有参数的版本则会出错。如果您不关心引起问题的特定错误,则布尔返回值可简化此操作。 error_code(无论是引发还是包含在参数中)为您提供了更多详细信息。

因此,回答您的问题:

  1. 如果成功,则返回true,否则返回false
  2. 如果要获取有关错误的详细信息,可以从异常或error_code参数中获取。请记住,这可能与系统有关。