boost :: copy_file copy_option, чтобы пропустить существующий файл назначения? - PullRequest
1 голос
/ 13 июля 2011

Я хотел бы скопировать файл в другой, и я хотел бы использовать 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 здесь: как выполнить boost :: filesystem copy_file с перезаписью

Однако моя проблема в том, что я не знаю, как использовать опцию fail_if_exists = none.Я бы хотел пропустить операцию копирования, если целевой файл уже существует.

Я знаю, что это возможно с помощью if ( !exists(path) ), но я хочу понять, как работает copy_option.

Как использовать fail_if_exists = none внутри функции Boost :: copy_file?

Обновление : исправлен код, тот, что на сайте Boost Doc немного сломан.

Ответы [ 2 ]

2 голосов
/ 13 июля 2011

Нет 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;
}
0 голосов
/ 13 июля 2011

Это восходит к этому предложению , чтобы обеспечить более плавный переход старого взлома scoped-enum-hack в clean-c ++ 0x-enum-classes:

 namespace FooEnum {
     enum type {
         SomeValue
     }
 }

Пользователи могли тогда написать FooEnum::SomeValue, и столкновения имя-значение были исключены.C ++ 0x будет иметь встроенную поддержку для этого.

Итак, вы бы просто использовали <enum-name>::<enum-value>, то есть copy_option::none и т. Д.

...