2014-06-13 17 views
7

Tôi đang cố chuyển tệp từ vị trí này sang vị trí khác bằng cách sử dụng boost::filesystem. Tôi đã sử dụng chức năng boost::filesystem::rename nhưng khi tôi cố gắng làm điều đó, tôi có lỗi sau.Lỗi liên kết thiết bị chéo không hợp lệ với hệ thống tập tin tăng cường

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) 

Tôi hiểu rằng vấn đề là tôi đang cố di chuyển tệp từ một thư mục này sang thư mục khác được gắn trên ổ đĩa khác.

Có bất kỳ giải pháp khác nhau từ

  1. sao chép các tập tin và sau đó xóa nó (nó mang lại cho tôi một số cảm giác an toàn).
  2. gói mv trong cuộc gọi đến std::systen?

Có funciton khác trong boost::filesystem cho những gì tôi muốn đạt được? Tôi không thể tìm thấy nó.

Tôi đang làm việc với g + + và linux.

+1

Lựa chọn 1 là những gì '/ bin/mv' làm khi một nỗ lực ban đầu tại 'đổi tên()' thất bại ... – twalberg

+0

Thanks a lot. Nếu bạn dán câu trả lời của bạn vào một câu trả lời, tôi sẽ gắn cờ nó là câu trả lời chính xác. –

+0

này cũng xảy ra đối với Python 'os.rename() '. –

Trả lời

13

Nếu đổi tên một tập tin (cuối cùng thông qua các cuộc gọi rename() thư viện, cho dù đó là gói lên trong boost:: hoặc bất cứ điều gì khác) không thành công vì nguồn và đích là trên các hệ thống tập tin khác nhau, lựa chọn duy nhất là để sau đó sao chép các tập tin và xóa các ban đầu sau khi xác minh rằng bản sao đã hoàn tất và thành công. Đây là những gì /bin/mv không - nó đầu tiên cố gắng một rename(), và nếu mã lỗi trả về bởi đó là thất bại chỉ ra một tình huống liên kết trên nhiều thiết bị, nó rơi trở lại một bản sao và loại bỏ kịch bản.

Các vấn đề liên quan