10 ответов:
копирует весь каталог в новое место с сохранением файла даты. Этот метод копирует указанный каталог и все его дочерние элементы каталоги и файлы к указанному назначение. Назначения новое местоположение и название объекта справочник.
создается каталог назначения если он не существует. Если каталог назначения не существует, то этот метод объединяет источник с назначения, с источником, принимая старшинство.
чтобы сделать это, вот пример кода
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<Path> { 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));
Если вы предпочитаете просто встроить все (не слишком эффективно, если вы используете его часто, но хорошо для quickies)
final Path targetPath = // target final Path sourcePath = // source Files.walkFileTree(sourcePath, new SimpleFileVisitor<Path>() { @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, вы можете рычаг Муравей чтобы делать:
new AntBuilder().copy( todir:'/path/to/destination/folder' ) { fileset( dir:'/path/to/src/folder' ) }
AntBuilder является частью дистрибутива и списка автоматического импорта, что означает, что он напрямую доступен для любого кода groovy.
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(); } } } }
- использование веб-сервера Apache FileUtils.copyDirectory
- пишите ваш собственный, например, этот парень обеспечивает пример кода.
- Java 7: взгляните на java.НИО.файл.Файлы.
ни FileUtils.copyDirectory(), ни Архимеда копировать атрибуты каталога (владелец файла, разрешения, время изменения и т. д.).
https://stackoverflow.com/a/18691793/14731 обеспечивает полное решение JDK7, которое делает именно это.
Это мой кусок Заводной код для этого. Проверенный.
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<Path> allFilesPathStream = Files.walk(sourceParentFolder); Consumer<? super Path> action = new Consumer<Path>(){ @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,
java.nio.file.Files
возможности скопировать метод удобства.ссылки
Если вы открыты для использования сторонней библиотеки, проверьте 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
также можно указать фильтр файлов, чтобы указать, какие файлы вы хотите скопировать. Здесь есть еще примеры:
Comments