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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.