将整个目录内容复制到另一个目录?

方法来复制整个目录内容到另一个目录在Java或Groovy?

FileUtils.copyDirectory()

将整个目录复制到保存文件date的新位置。 此方法将指定的目录及其所有子目录和文件复制到指定的目标。 目的地是目录的新位置和名称。

如果目标目录不存在,则创build目标目录。 如果目标目录确实存在,则此方法将源与目标合并,源优先。

以下是使用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)); 

如果你宁愿把所有东西都内联(如果你经常使用它,效率不是很高,但是对于速度快)

  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,你可以利用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(); } } } } 
  • 使用Apache的FileUtils.copyDirectory
  • 写你自己的例如这个家伙提供的例子代码 。
  • Java 7:看看java.nio.file.Files 。

FileUtils.copyDirectory()和Archimedes的答案均不复制目录属性(文件所有者,权限,修改时间等)。

https://stackoverflow.com/a/18691793/14731提供了一个完整的JDK7解决scheme。;

这是我的一块Groovy代码。 testing。

 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的推出,下面也是一个可行的解决scheme

 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类将提供复制方便的方法。

参考

  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 

您还可以提供文件filter来指定要复制的文件。 这里有更多的例子:

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