Я ищу наиболее эффективный способ рекурсивного перемещения каталога в Java. На данный момент я использую Apache commons-io, как показано в коде ниже. (Если destDir
существует и содержит часть файлов, я бы хотел, чтобы они были перезаписаны, а вложенные структуры каталогов были объединены).
FileUtils.copyDirectoryToDirectory(srcDir, destDir);
FileUtils.deleteDirectory(srcDir);
Хотя это помогает, на мой взгляд, это недостаточно эффективно. Есть как минимум две проблемы, которые приходят на ум:
- Вам понадобится вдвое больше места.
- Если это SSD, копирование данных на другую часть диска и последующее стирание старых данных в конечном итоге повлияет на аппаратное обеспечение, поскольку фактически сократит срок службы жесткого диска.
Каков наилучший подход для этого?
Насколько я понимаю, commons-io
, похоже, не использует новые функции Java 7/8, доступные в Files
. С другой стороны, мне не удалось заставить работать Files.move(...)
, если существует destDir
(под "заставить его работать" я имею в виду объединение структур каталогов - он жалуется, что destDir
существует).
По поводу сбоев в движении (поправьте меня, если я ошибаюсь):
- Насколько я понимаю, атомарное перемещение выполняется только в том случае, если все файлы перемещаются одновременно. Если я правильно понимаю, это означает, что это сначала копирование, а затем удаление. Я не думаю, что это то, что я ищу.
- Если определенный путь/файл нельзя переместить, то операция должна прекратиться и вызвать исключение, сохраняя текущий исходный путь, по которому она была достигнута.
Обратите внимание, что я не ограничиваюсь использованием библиотеки commons-io
. Я открыт для предложений. Я использую Java 8.
Files.move(source, target)
? - person Sergey Kalinichenko   schedule 15.08.2015rsync
илиmv
. - person carlspring   schedule 15.08.2015destDir
может существовать, а может и не существовать. Если он существует и в нем есть какие-то файлы/каталоги, то они должны быть перезаписаны, а структуры каталогов обоих каталогов должны быть объединены. Это не rsync-подобная синхронизация обеих сторон, это будет слияние, только если существуетdestDir
. - person carlspring   schedule 15.08.2015