Можно ли программным образом определить, приведет ли перемещение файла к копии?
Моя программа 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
, так и НЕ МОЖЕТ выполнять атомарное перемещение из одного в другое.