повышение:: файловая система:: переименуйте: не Может создать файл, когда тот файл уже существует

Я переименовываю файл с помощью повышения:: файловая система и иногда конечный файл будут существовать. Согласно документации повышения здесь:

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, так не знайте, существует ли проблема там также.

5
задан Simon Elliott 1 July 2010 в 10:15
поделиться

1 ответ

Похоже, это было исправлено, но только в песочнице "V3" версии Boost.Filesystem, которой пока нет в основных выпусках Boost.

Я тестировал Boost 1.43.0 в Linux с теми же результатами - на самом деле в отчете об ошибке указывается код нарушения, который явно проверяет наличие в POSIX и выдает исключение.Возможно, это было сделано изначально, потому что MoveFile в Windows демонстрирует такое же поведение? В версии для песочницы V3 переименование вызовет MoveFileEx в Windows и std :: rename в POSIX и позволяет перезаписать существующий файл.

Я полагаю, вы могли бы обойти это, вызвав boost :: filesystem :: remove на цели перед вызовом boost :: filesystem :: rename , в зависимости от того, требуется ли вашей программе операция должна быть атомарной или нет.

5
ответ дан 14 December 2019 в 18:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: