代码之家  ›  专栏  ›  技术社区  ›  rioki

复制文件什么时候实际返回假?

  •  3
  • rioki  · 技术社区  · 7 年前

    简单的版本 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¶meter的重载会在底层OS API错误上引发文件系统错误,该错误是以from作为第一个路径参数构造的,to作为第二个路径参数,os错误代码作为错误代码参数构造的。

    这就引出了我的问题,如果失败(如权限不足、文件锁定和其他文件系统错误)导致异常,在什么情况下简单地 copy_file 永远不会回来 false ?

    2 回复  |  直到 7 年前
        1
  •  1
  •   The Quantum Physicist    7 年前

    你有两种方法来处理你的错误 filesystem . 这基本上是继承自提升。你要么把错误放在里面 error_code 引用,或者从异常中获取。

    基本上,接受参数的版本保证不会引发错误,不接受参数的版本则会引发错误。布尔返回简化了这一点,以防您不关心导致问题的特定错误。这个 错误代码 ,无论是抛出的还是参数中的,都会提供更多详细信息。

    所以,要回答你的问题:

    1. 如果成功则返回true,否则返回false
    2. 如果需要有关错误的详细信息,可以从异常或 错误代码 参数。请记住,这可能取决于系统。
        2
  •  3
  •   Bo R    7 年前

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