我想将文件复制到另一个文件,我想使用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有点破碎。
答案 0 :(得分: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;
}
答案 1 :(得分:0)
这可以追溯到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
等。