1

我想将一个文件复制到另一个文件,并且我想使用 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工作的。

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

更新:更正了代码,boost doc 网站上的代码有点损坏。

4

2 回答 2

2

如果目的地已经存在,则不能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;
}
于 2011-07-13T15:10:39.607 回答
0

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

 namespace FooEnum {
     enum type {
         SomeValue
     }
 }

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

因此,您只需使用<enum-name>::<enum-value>, iecopy_option::none等。

于 2011-07-13T14:54:51.580 回答