Как перемещать (большие) файлы между файловыми системами в Java?

В моем приложении Java 7 мне нужно переместить все файлы и каталоги в sourceFolder в другой destinationFolder. Я не знаю, находятся ли эти две папки в одной и той же файловой системе или разделе, поскольку обе могут быть указаны пользователем во время выполнения.

Поскольку файлы и каталоги для перемещения могут быть довольно большими (несколько ГБ), я искал эффективный способ их перемещения. Поэтому их следует копировать только в том случае, если sourceFolder и destinationFolder не находятся в одной и той же файловой системе. Поэтому в идеале операция перемещения в той же файловой системе должна быть операцией переименования, если это возможно.

Приложение используется как в системах Windows, так и в Linux.

Я знаю о некоторых функциях, связанных с Java 7 Однако они не позволяют переместить все содержимое папки в другое место, если она не пуста, что в моем случае является требованием. Я также нашел Apache Common FileUtils, который выглядит многообещающе. Однако в его документации говорится, что следует выполнить операцию "копировать и удалить", если sourceFolder и destinationFolder не находятся в одной и той же файловой системе.

Итак, мой вопрос: когда я использую этот класс FileUtils, как я могу проверить файловые системы sourceFolder и destinationFolder кроссплатформенным образом?


person Matthias    schedule 17.10.2013    source источник


Ответы (1)


Я предполагаю, что вы имеете в виду FileUtils.moveFile().

moveFile заботится о случае, когда источник и место назначения находятся в разных каталогах. Что он делает, так это пытается использовать File.renameTo, и если это не удается, он пытается скопировать файл. (См. исходный код.) Короче говоря, вам не нужно самостоятельно проверять . ..

Но в ответ на ваш фактический вопрос ни File, ни Apache FileUtils не предоставляют способа проверить, находятся ли два каталога в одной и той же файловой системе. Но (я думаю) вы можете сделать это, используя функциональность Java 7, примерно так:

Path path1 = new File(str1).toPath();
Path path2 = new File(str2).toPath();
if (path1.getFileSystem().equals(path2.getFileSystem()) {
    ...
person Stephen C    schedule 17.10.2013
comment
@Matthias Обратите внимание, что FileSystem не представляет разные диски. - person Sotirios Delimanolis; 18.10.2013
comment
Это должно работать в Windows, но я не уверен в файловой системе Unix. - person ; 18.10.2013