Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Invalid cross-device link error with boost filesystem

I am trying to move a file from a location to another using boost::filesystem. I used boost::filesystem::rename function but when I try to do that I have the following error.

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)

I understood that the problem is that I am trying to move a file from one folder into another mounted on a different volume.

Is there any solution different from

  1. COPYING the file and then DELETE it (it gives me some feeling of security).
  2. wrapping mv in a call to std::systen?

Is there any other funciton in boost::filesystem for what I want to achieve? I cannot find it myself.

I am working with g++ and linux.

like image 999
Abruzzo Forte e Gentile Avatar asked Jun 13 '14 16:06

Abruzzo Forte e Gentile


1 Answers

If renaming a file (ultimately through the rename() library call, whether it's wrapped up in boost:: or anything else) fails because the source and destination are on different file systems, the only option is to then copy the file and delete the original after verifying that the copy was complete and successful. This is what /bin/mv does - it first tries a rename(), and if the error code returned by it's failure indicates a cross-device link situation, it falls back to a copy and remove scenario.

like image 101
twalberg Avatar answered Sep 16 '22 23:09

twalberg