Скопировать содержимое всего каталога в другой каталог?

Способ копирования всего содержимого каталога в другой каталог в java или groovy?

FileUtils.copyDirectory()

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

Целевой каталог создается, если он не существует. Если целевой каталог существует, то этот метод объединяет источник с пунктом назначения, причем исходный код имеет приоритет.

Чтобы сделать это, вот пример кода

 String source = "C:/your/source"; File srcDir = new File(source); String destination = "C:/your/destination"; File destDir = new File(destination); try { FileUtils.copyDirectory(srcDir, destDir); } catch (IOException e) { e.printStackTrace(); } 

Ниже приведен пример использования JDK7.

 public class CopyFileVisitor extends SimpleFileVisitor { private final Path targetPath; private Path sourcePath = null; public CopyFileVisitor(Path targetPath) { this.targetPath = targetPath; } @Override public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attrs) throws IOException { if (sourcePath == null) { sourcePath = dir; } else { Files.createDirectories(targetPath.resolve(sourcePath .relativize(dir))); } return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException { Files.copy(file, targetPath.resolve(sourcePath.relativize(file))); return FileVisitResult.CONTINUE; } } 

Чтобы использовать посетителя, сделайте следующее

 Files.walkFileTree(sourcePath, new CopyFileVisitor(targetPath)); 

Если вы предпочитаете просто встроить все (не слишком эффективно, если вы часто используете его, но хорошо для быстрых)

  final Path targetPath = // target final Path sourcePath = // source Files.walkFileTree(sourcePath, new SimpleFileVisitor() { @Override public FileVisitResult preVisitDirectory(final Path dir, final BasicFileAttributes attrs) throws IOException { Files.createDirectories(targetPath.resolve(sourcePath .relativize(dir))); return FileVisitResult.CONTINUE; } @Override public FileVisitResult visitFile(final Path file, final BasicFileAttributes attrs) throws IOException { Files.copy(file, targetPath.resolve(sourcePath.relativize(file))); return FileVisitResult.CONTINUE; } }); 

С Groovy вы можете использовать Ant для выполнения:

 new AntBuilder().copy( todir:'/path/to/destination/folder' ) { fileset( dir:'/path/to/src/folder' ) } 
 public static void copyFolder(File source, File destination) { if (source.isDirectory()) { if (!destination.exists()) { destination.mkdirs(); } String files[] = source.list(); for (String file : files) { File srcFile = new File(source, file); File destFile = new File(destination, file); copyFolder(srcFile, destFile); } } else { InputStream in = null; OutputStream out = null; try { in = new FileInputStream(source); out = new FileOutputStream(destination); byte[] buffer = new byte[1024]; int length; while ((length = in.read(buffer)) > 0) { out.write(buffer, 0, length); } } catch (Exception e) { try { in.close(); } catch (IOException e1) { e1.printStackTrace(); } try { out.close(); } catch (IOException e1) { e1.printStackTrace(); } } } } 
  • Использовать файл FileUtils.copyDirectory от Apache
  • Напишите свой собственный, например, этот парень предоставляет пример кода .
  • Java 7: взгляните на java.nio.file.Files .

Ни FileUtils.copyDirectory (), ни атрибуты каталога копирования Архимеда (владелец файла, разрешения, время модификации и т. Д.).

https://stackoverflow.com/a/18691793/14731 предоставляет полное решение JDK7, которое делает именно это.

Это мой кусок кода Groovy для этого. Проверено.

 private static void copyLargeDir(File dirFrom, File dirTo){ // creation the target dir if (!dirTo.exists()){ dirTo.mkdir(); } // copying the daughter files dirFrom.eachFile(FILES){File source -> File target = new File(dirTo,source.getName()); target.bytes = source.bytes; } // copying the daughter dirs - recursion dirFrom.eachFile(DIRECTORIES){File source -> File target = new File(dirTo,source.getName()); copyLargeDir(source, target) } } 

С приходом Java NIO ниже также возможно решение

С Java 9:

 private static void copyDir(String src, String dest, boolean overwrite) { try { Files.walk(Paths.get(src)).forEach(a -> { Path b = Paths.get(dest, a.toString().substring(src.length())); try { if (!a.toString().equals(src)) Files.copy(a, b, overwrite ? new CopyOption[]{StandardCopyOption.REPLACE_EXISTING} : new CopyOption[]{}); } catch (IOException e) { e.printStackTrace(); } }); } catch (IOException e) { //permission issue e.printStackTrace(); } } 

С Java 7:

 import java.io.IOException; import java.nio.file.FileAlreadyExistsException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.function.Consumer; import java.util.stream.Stream; public class Test { public static void main(String[] args) { Path sourceParentFolder = Paths.get("/sourceParent"); Path destinationParentFolder = Paths.get("/destination/"); try { Stream allFilesPathStream = Files.walk(sourceParentFolder); Consumer action = new Consumer(){ @Override public void accept(Path t) { try { String destinationPath = t.toString().replaceAll(sourceParentFolder.toString(), destinationParentFolder.toString()); Files.copy(t, Paths.get(destinationPath)); } catch(FileAlreadyExistsException e){ //TODO do acc to business needs } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }; allFilesPathStream.forEach(action ); } catch(FileAlreadyExistsException e) { //file already exists and unable to copy } catch (IOException e) { //permission issue e.printStackTrace(); } } } 

Что касается Java , в стандартном API такого метода нет. В Java 7 class java.nio.file.Files предоставит метод удобства копирования .

Рекомендации

  1. Учебники Java

  2. Копирование файлов из одного каталога в другой в Java

Если вы открыты для использования сторонней библиотеки, проверьте javaxt-core . Класс javaxt.io.Directory можно использовать для копирования таких каталогов:

 javaxt.io.Directory input = new javaxt.io.Directory("/source"); javaxt.io.Directory output = new javaxt.io.Directory("/destination"); input.copyTo(output, true); //true to overwrite any existing files 

Вы также можете указать фильтр файлов, чтобы указать, какие файлы вы хотите скопировать. Здесь есть еще несколько примеров:

http://javaxt.com/javaxt-core/io/Directory/Directory_Copy

  • Как объединить два файла PDF в один на Java?
  • Почему допустимая статическая конечная переменная не разрешена в статическом блоке инициализации?
  • Путаница обнаружения столкновений прямоугольника Java
  • Передача непосредственно инициализатора массива параметру метода не работает
  • Насколько медленны исключения Java?
  • Java: рекомендуемое решение для глубокого клонирования / копирования экземпляра
  • Есть ли что-то вроде интерактивного режима REPL для python, но для Java?
  • Что делать с высокой эффективностью Java BigDecimal?
  • Это лучший способ переписать содержимое файла на Java?
  • Как я могу вырезать ArrayList из ArrayList в Java?
  • Сервлет для обслуживания статического содержимого
  • Давайте будем гением компьютера.