Просмотр исходного кода

[Linux/BSD] Fix cross-device rename.

bruvzg 10 месяцев назад
Родитель
Сommit
4cc9d2f437
1 измененных файлов с 11 добавлено и 1 удалено
  1. 11 1
      drivers/unix/dir_access_unix.cpp

+ 11 - 1
drivers/unix/dir_access_unix.cpp

@@ -410,7 +410,17 @@ Error DirAccessUnix::rename(String p_path, String p_new_path) {
 		p_new_path = p_new_path.left(-1);
 	}
 
-	return ::rename(p_path.utf8().get_data(), p_new_path.utf8().get_data()) == 0 ? OK : FAILED;
+	int res = ::rename(p_path.utf8().get_data(), p_new_path.utf8().get_data());
+	if (res != 0 && errno == EXDEV) { // Cross-device move, use copy and remove.
+		Error err = OK;
+		err = copy(p_path, p_new_path);
+		if (err != OK) {
+			return err;
+		}
+		return remove(p_path);
+	} else {
+		return (res == 0) ? OK : FAILED;
+	}
 }
 
 Error DirAccessUnix::remove(String p_path) {