2015-10-02 7 views
-1

Я все еще относительно новичок в java, но у меня есть опыт в сценариях, таких как DOS, Windows и Bash. сегодня я бы хотел, чтобы EASILY рекурсивно копировал содержимое каталога (файлы и каталоги) из sourceDir в destinationDir из моего приложения Java CLI.

Я искал сеть вверх и вниз и нашел PLENTY из «решений» для этого, используя Оракулы и/или Apache FileUtils и т. Д. Но все они требуют своего рода «изобретать колесо» и представляют собой 20+ строк кода, обрабатывая каждый и каждый файл и dir отдельно с большой возможностью для чего-то, что в командной строке оболочки выполняется с помощью SINGLE LINE.

Для обоих на Windows, и Linux, его обычно не более, чем просто ...

cp -a "$sourceDir"/* "$targetDir" # on linux 

или

xcopy /s /e %srcdir%\* %trgtdir% # on windows 

Но я не смог найти готовую библиотеку или инструмент для Java, что делает просто так, как xcopy/robocopy или cp на bash, не добавляя мой новый класс «copy» в мое приложение: /.

Есть ли веская причина, почему я должен «изобретать колесо» и не просто выполнять какое-то «внешнее выполнение оболочки», чтобы вызвать один из этих инструментов командной строки, чтобы выполнить работу в пределах 2-3 строк Код?

Спасибо за любые советы и пояснения. Axel

+1

Вы можете использовать библиотеку Apache Commons: [ 'FileUtils.copyDirectory()'] (https://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/FileUtils .html # copyDirectory (java.io.File,% 20java.io.File)). – Phylogenesis

+1

Я думаю, что кто-то меня неправильно понял. если для JAVA существует «однострочное» решение, это будет то, что я ищу, но еще не найдено. - все, что я нашел, требует МНОГО больше, чтобы добавить к моему коду, чтобы выполнить работу. поэтому я был бы счастлив, если бы вы могли показать мне, что «один лайнер» выполнит эту работу с помощью java. - Кстати ... Apache FileUtils, кажется, НЕ делает работу, как просили. они копируют каталог в директорию. но НЕ содержание этого каталога в директорию. также они, похоже, не поддерживают рекурсию и глобусы без достаточной дополнительной подготовки и фильтрации. :/ –

+0

@AxelWerner, пожалуйста, посмотрите на мой ответ .... вы неправильно понимаете, что означает 'cp' .... –

ответ

1

Apache Commons I/O имеет метод, который делает это, вам нужно использовать three-argument version of FileUtils.copyDirectory вместо версии два-аргумента (который копирует сам, а не его содержимое каталога):

public static void copyDirectory(File srcDir, File destDir, boolean preserveFileDate) throws IOException

Этот метод копирует содержимое указанного исходного каталога в указанный каталог назначения.

+0

. О, я полностью пропустил этот пункт, просматривая JavaDocs. БЛАГОДАРЯ! - Но они не много говорят о рекурсии (если включены подкаталоги или нет).я собираюсь проверить это. –

+0

это сработало для меня! что имя метода не означает, что этот метод немного отличается от всех остальных. Я пропустил эту точку при чтении через javaDocs этой библиотеки. спасибо за подсказку! –

0

Я искал чистый вверх и вниз, и нашли множество «решений» к этому, используя Oracles и/или Apaches FileUtils и т.д. обработки каждого и каждый файл и Дира отдельно с большим позволить себе что-то, что в командной строке оболочка выполняется ОДИНОЧНОЙ ЛИНИЕЙ.

Моя первая мысль ...

................................. ..........

Почему вы говорите, что ApacheCommons.FileUtils - это 20 + строк кода?

copyDirectoryToDirectory(File srcDir, File destDir) API says:

Копирование каталога в пределах другой директории с сохранением даты файла.

Этот метод копирует исходный каталог и все его содержимое в каталог с таким же именем в указанном каталоге назначения.

FileUtils.copyDirectoryToDirectory(new File(folder_source), new File(folder_destiny)); 

Но все они требуют своего рода "изобретать колесо" и являются 20+ Строки кода

ли проверить вас, как долго источник команды ср код?

Здесь находится: cp.c от www.gnu.org более 1000 строк кода.

+1

Я согласен с вашим первоначальным ответом. Моя реакция была такой: http://i.imgur.com/FDWyFSD.gif – Tschallacka

+0

Я прочитал JavaDocs для FileUtils.copyFile и copyDir, и, насколько я понял, он копирует «один файл в файл» или «один каталог в dir ", нет поддержки подстановочных знаков или рекурсивного использования, или я совершенно не прав ??! –

+0

, если он копирует полные копии каталога рекурсивно, никаких подстановочных знаков, кроме 'FileFilter'. –

1

Вот один оператор Java решение:

Runtime.exec(new String[] {"sh", "-c", 
          "cp -a \"" + src + ""/* \"" + target + "\""}); 

Очевидно, что не портативный, но нет никакого переосмысления колес здесь.

Трюк заключается в том, чтобы позволить оболочке обрабатывать расширение подстановки для вас.