Можно ли программным образом определить, приведет ли перемещение файла к копии?

Моя программа Java должна синхронно перемещать файл на сервере, т.е. в пределах одного и того же набора локальных файловых систем. Очевидным решением является использование Files.move(). Тем не менее, я читал, что в некоторых случаях, например. в файловых системах движение будет возвращаться к копированию и удалению. Когда я перемещаю большие файлы, я хотел бы сообщить о прогрессе пользователю, если произойдет копия (так как будет заметная задержка).

Однако я не могу найти простой способ сделать это с помощью Java API. Я мог бы написать свою собственную процедуру копирования, которая сообщает о прогрессе, но тогда мне нужно будет знать, приведет ли движение к копированию.

Кажется, что одна из возможностей:

try {
    Files.move(src, dest, CopyOption.ATOMIC_MOVE);
} catch (AtomicMoveNotSupportedException  e) {
    // Perform a copy instead (and report progress)
}

Однако мне это не понятно из Java doco, если бы это было правильно во всех случаях. Действительно ли это правильное решение? Если нет, есть ли другой способ?

Ответы

Ответ 1

Да, ваше решение в порядке.

Хотя на самом деле файловые системы не изменяются, они перемещаются в копии. Атомная операция - это операция, которая имеет место на одном физическом устройстве, что означает, что Files.move(..,..,CopyOption.ATOMIC_MOVE) всегда будет успешным, если вы не скопируете на другой диск или если по какой-либо причине файловая система или ОС не поддерживают атомные операции. Это означает, что вы можете иметь /dev/sda/ и /dev/sdb, как с файловой системой ext4, так и НЕ МОЖЕТ выполнять атомарное перемещение из одного в другое.