Недопустимая ошибка связи между устройствами с файловой системой boost

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

terminate called after throwing an instance of 
'boost::filesystem::filesystem_error'
what():  boost::filesystem::rename: Invalid cross-device link: 
"./file_A.csv",    "/opt/data/file_B.csv"
Aborted (core dumped)

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

Есть ли решение, отличное от

  1. КОПИРОВАТЬ файл, а затем УДАЛИТЬ его (это дает мне чувство безопасности).
  2. обернуть mv вызовом std::systen?

Есть ли в boost::filesystem какая-либо другая функция для того, чего я хочу достичь? сам найти не могу.

Я работаю с g++ и linux.


person Abruzzo Forte e Gentile    schedule 13.06.2014    source источник
comment
Вариант 1 — это то, что делает /bin/mv, когда первоначальная попытка rename() не удалась...   -  person twalberg    schedule 13.06.2014
comment
Большое спасибо. Если вы прикрепите свой ответ к ответу, я отмечу его как правильный.   -  person Abruzzo Forte e Gentile    schedule 13.06.2014
comment
Это также происходит для Python os.rename().   -  person rr-    schedule 08.06.2015


Ответы (1)


Если переименование файла (в конечном итоге через вызов библиотеки rename(), независимо от того, заключен ли он в boost:: или как-то еще) не удается, потому что источник и место назначения находятся в разных файловых системах, единственный вариант — затем скопировать файл и удалить оригинал после проверки, что копия была полной и успешной. Это то, что делает /bin/mv — сначала он пытается rename(), и если код ошибки, возвращаемый его сбоем, указывает на ситуацию связи между устройствами, он возвращается к сценарию копирования и удаления.

person twalberg    schedule 13.06.2014