【问题标题】:boost::copy_file copy_option to skip over existing destination file?boost::copy_file copy_option 跳过现有的目标文件?
【发布时间】:2011-07-13 14:08:07
【问题描述】:

我想将一个文件复制到另一个文件,并且我想使用 Boost::copy_file。它有一个名为 copy_option 的参数,可以是:

  BOOST_SCOPED_ENUM_START(copy_option)
    {none, fail_if_exists = none, overwrite_if_exists};
  BOOST_SCOPED_ENUM_END

我在这里发现了关于overwrite_if_exists 行为的另一个问题:how to perform boost::filesystem copy_file with overwrite

然而,我的问题是我不知道如何使用fail_if_exists = none 选项。如果目标文件已经存在,我想跳过复制操作。

我知道if ( !exists(path) ) 是可能的,但我想了解copy_option 是如何工作的。

如何在 Boost::copy_file 函数中使用fail_if_exists = none

更新:更正了代码,the one on boost doc website 有点坏了。

【问题讨论】:

  • 我的 Boost 版本没有none。您使用的是哪个版本?在您发布的代码中,none 之后应该有一个逗号。
  • 你说得对,文档中的那个坏了。

标签: c++ boost boost-filesystem


【解决方案1】:

如果目标已存在,则没有 copy_option 可以跳过副本。

if (!exists(path)) copy_file(...) 也不是正确答案,因为存在竞争条件:文件可能是在您执行存在性检查和尝试复制之间创建的。因此,即使您检查文件是否存在,copy_file 也可能会失败。

合成你想要的东西的方法是捕获错误并自己忽略它。像这样的:

try {
    copy_file(...);
}
catch (const boost::system::system_error &err) {
    if (!err.code().equivalent(boost::system::errc::file_exists))
        throw;
}

【讨论】:

  • 将异常提升到正常工作流程似乎效率很低。使用变体返回 error_code 可能会更好
【解决方案2】:

这可以追溯到this proposal,以便让旧的 scoped-enum-hack 更平滑地过渡到 clean-c++0x-enum-classes:

 namespace FooEnum {
     enum type {
         SomeValue
     }
 }

然后用户可以编写FooEnum::SomeValue 并避免值名冲突。 C++0x 将对此提供本机支持。

所以,您只需使用<enum-name>::<enum-value>,即copy_option::none 等。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-02
    • 2014-01-03
    • 2011-06-14
    • 2018-11-03
    • 1970-01-01
    • 2018-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多