Я переименовываю файл с помощью повышения:: файловая система и иногда конечный файл будут существовать. Согласно документации повышения здесь:
http://www.boost.org/doc/libs/1_42_0/libs/filesystem/doc/reference.html#Non-member-functions
шаблон пусто переименовывает (константа Path1& from_p, константа Path2& to_p); Требует: Path1:: external_string_type и Path2:: external_string_type являются тем же типом.
Эффекты: Переименовывает from_p к to_p, как будто POSIX переименовывают ().
Постусловия:! существует (from_p) &&, существует (to_p), и содержание и атрибуты файла, первоначально названные from_p в других отношениях неизменны.
[Примечание: Если from_p и to_p решают в тот же файл, никакие меры не приняты. Иначе, если to_p решает в существующий файл, он удален. Символьная ссылка самостоятельно переименована, а не файл, который она разрешает к тому, чтобы быть переименованным. - заканчивают примечание]
(мой акцент)
При тестировании этого кода, скомпилированного с помощью Visual Studio MS 2008 на XP SP3, переименовать повышении бросков:: файловая система:: filesystem_error с сообщением:
Не может создать файл, когда тот файл уже существует
Я отмечаю, что это было повышено в отчете об ошибках: https://svn.boost.org/trac/boost/ticket/2866
... но требования, которые будут закрыты в Повышении 1.41.0, и я использую Повышение 1.42.0.
Я делающий что-то не так здесь или если я просто возвращаюсь к станд.:: переименовать?
Я еще не протестировал это на Linux, так не знайте, существует ли проблема там также.
Похоже, это было исправлено, но только в песочнице "V3" версии Boost.Filesystem, которой пока нет в основных выпусках Boost.
Я тестировал Boost 1.43.0 в Linux с теми же результатами - на самом деле в отчете об ошибке указывается код нарушения, который явно проверяет наличие в POSIX и выдает исключение.Возможно, это было сделано изначально, потому что MoveFile
в Windows демонстрирует такое же поведение? В версии для песочницы V3 переименование вызовет MoveFileEx
в Windows и std :: rename
в POSIX и позволяет перезаписать существующий файл.
Я полагаю, вы могли бы обойти это, вызвав boost :: filesystem :: remove
на цели перед вызовом boost :: filesystem :: rename
, в зависимости от того, требуется ли вашей программе операция должна быть атомарной или нет.