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

Я переименовываю файл, используя 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 & амп; Топ); Требуется:   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, поэтому не знаю, существует ли там проблема.

4 голоса | спросил Simon Elliott 1 J000000Thursday10 2010, 14:15:04

1 ответ


0

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

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

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

ответил bjlaub 1 J000000Thursday10 2010, 17:14:22

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132