Invalid cross-device link error with boost filesystem

Abruzzo Forte e Gentile picture Abruzzo Forte e Gentile · Jun 13, 2014 · Viewed 7.3k times · Source

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.

Answer

twalberg picture twalberg · Jun 13, 2014

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.