boost :: filesystem :: rename: невозможно создать файл, если этот файл уже существует - PullRequest
4 голосов
/ 01 июля 2010

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

http://www.boost.org/doc/libs/1_42_0/libs/filesystem/doc/reference.html#Non-member-functions

шаблон void rename (const Path1 & from_p, const Path2 & to_p); Требуется: Path1 :: external_string_type и Path2 :: external_string_type являются того же типа.

Эффекты: переименовывает из_p в to_p, как будто POSIX переименовать ().

Постусловия:! Существует (from_p) && существует (to_p), а содержимое и атрибуты файла изначально иначе имя from_p не изменяется.

[Примечание: если from_p и to_p разрешить в тот же файл, никаких действий не предпринимается. В противном случае , если to_p разрешается в существующий файл, он удален . символическая ссылка сама переименована, а не файл, который он разрешает переименовывается - конец примечания]

(мой акцент)

При тестировании этого кода, скомпилированного с помощью MS Visual Studio 2008 на XP SP3, переименование вызывает boost :: filesystem :: filesystem_error с сообщением:

Невозможно создать файл, если этот файл уже существует

Я отмечаю, что это было поднято в отчете об ошибке: https://svn.boost.org/trac/boost/ticket/2866

... но утверждает, что закрыт в Boost 1.41.0, а я использую Boost 1.42.0.

Я что-то здесь не так делаю или мне просто нужно вернуться к std :: rename?

Я еще не проверял это в Linux, поэтому не знаю, существует ли там проблема.

1 Ответ

4 голосов
/ 01 июля 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...