Скопировать содержимое всего каталога в другой каталог?
Способ копирования всего содержимого каталога в другой каталог в java или groovy?
- Как решить "java.io.IOException: ошибка = 12, Невозможно выделить память" вызов Runtime # exec ()?
- Eclipse Java; экспортная банка, include ссылки на библиотеки, без fatjar
- Получите самые высокие частоты из индекса Lucene
- Есть ли разница в производительности между Javac debug on и off?
- Do / can абстрактные classы заменяют интерфейсы?
- Джерси ClientResponse.getEntity общего типа
- Можно ли отключить jsessionid в сервлете tomcat?
- Запись в stream файлов, возвращенный из getResourceAsStream ()
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 super Path> 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
предоставит метод удобства копирования .
Рекомендации
-
Учебники Java
-
Копирование файлов из одного каталога в другой в 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
Вы также можете указать фильтр файлов, чтобы указать, какие файлы вы хотите скопировать. Здесь есть еще несколько примеров: