LINUX.ORG.RU

[java] перемещение файла

 


0

0
есть ли какой нибудь способ средствами стандартных java библиотек переместить файл ?

File.renameTo не подходит в виду того что он не умеет это делать между разными физическими устройствами.

создание второго файла и запись в него содержимого первого то-же не подходит в виду необходимости атомарности операции.

вызов внешних программ типа "mv" то-же не подходит.

есть стандартный способ ?

Совсем стандартного нету =(. Посмотри в java.nio.Chanel - там есть метод свалить всё в другой канал. Это самый эффективный метод.
theos ★★★
()
>File.renameTo не подходит в виду того что он не умеет это делать между разными физическими устройствами.

Все верно. Тут даже mv не переместит, а просто скопирует файл на другое устройство и удалит старый, тоже самое можно сделать на джаве.

Lucky1 ★★★
()
Ах да. Ещё есть Apache Commons - расширения джавовской стандартной куче полезных классов. 100% pure java
theos ★★★
()
> создание второго файла и запись в него содержимого первого то-же не подходит в виду необходимости атомарности операции.

А как ты представляешь себе "атомарное" перемещение файла между различными устройствами????

public static void moveFile() {
try { File.renameTo(); }
catch (IOException x) {
[...open-read-write-delete...]
}
}
no-dashi ★★★★★
()
> есть стандартный способ ?

jastral же!
он умеет переносить файл без копирования даже на отключённые устройства.

пс: тредом поражён.
zh
()
А у Вас ОС гарантирует атомарность этого процесса? Если нет - каким образом может жабка над ОС это гарантировать?

Рекомендую. Если renameTo не прошло, скопировать во временный файл на нужном разделе, а потом атомарно переименовать.
svu ★★★★★
()
да действительно я протупил: mv то-же не делает перемещение между различыми устройствами атомарно, а жаль :(
xtron
() автор топика
Ответ на: комментарий от svu
дело в том что есть некий сторонний закрытый демон который ждет появления файлов в определенном каталоге и начинает их анализировать сразу как видит, соотвественно нужно предотвратить ситуацию когда он видит файл не доконца скопировавшимся, соответственно копирование файла должно быть атомарным. в пределах устройства копирование атомарно, а между устройствами увы нет. вообщем буду создать файл на том же устройстве и атомарно копировать в пределах того устройства, а изначально хотелось создавать в /tmp
xtron
() автор топика
Ответ на: комментарий от xtron
В пределах устройства _перемещение_ (а не копирование) атомарно. А так - стандартная задачка, да.
svu ★★★★★
()
Ответ на: комментарий от svu
угу, я имел ввиду атомарное перемещение
xtron
() автор топика
Ответ на: комментарий от svu
>В пределах устройства _перемещение_ (а не копирование) атомарно

Это не совсем так. При переименовании в пределах ФС файл _появляется_ атомарно. И исчезает из старого тоже. Но это min 2 операции, по меньшей мере в случае перемещениями между разными каталогами, и можно поймать момент, когда файл есть в обоих. Чаще всего это приемлемо, но истина дороже:)

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot
Это не так. Единственная ситуация, когда это возможно -- это когда newpath существует, о чём и написано в мане.
kemm
()
Ответ на: комментарий от kemm
>Единственная ситуация, когда это возможно -- это когда newpath существует, о чём и написано в мане

У меня, почему-то, ман не находится. Вывод сделан из "общих соображений", и предположения об отсутствии блокирования работы файловой системы. Последнее вполне может быть ложным, т.ч. я, возможно, ошибся.

DonkeyHot ★★★★★
()
Ответ на: комментарий от DonkeyHot
> предположения об отсутствии блокирования работы файловой системы

Это ОЧЕНЬ странное предположение... В таком разе ни одна гарантированно-атомарная операция (кроме атомарных в понимании процессора) её бы ни была. 8))

kemm
()
Ответ на: комментарий от kemm
>Это ОЧЕНЬ странное предположение

Не очень. Лень штука универсальная, а атоммарная реализация в дофига раз сложнее. Но если кому-то не лень порыться в исходниках -- истина там:)

DonkeyHot ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.