varios una txt ruta otra mover manejo entre eliminar directorios desde copiar carpetas carpeta archivos archivo java grails file-io groovy

java - una - Copie todo el contenido del directorio a otro directorio?



manejo de archivos y directorios en java (10)

Esta pregunta ya tiene una respuesta aquí:

¿Método para copiar el contenido completo del directorio a otro directorio en Java o Groovy?


Con Groovy, puede aprovechar Ant para hacer:

new AntBuilder().copy( todir:''/path/to/destination/folder'' ) { fileset( dir:''/path/to/src/folder'' ) }


Con la incorporación de Java NIO, a continuación también es posible una solución

Con 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(); } }

Con 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(); } } }



El siguiente es un ejemplo del uso de 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; } }

Para usar el visitante haz lo siguiente

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

Si prefieres simplemente poner en línea todo (no demasiado eficiente si lo usas a menudo, pero bueno para 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; } });


Esta es mi pieza de código Groovy para eso. Probado.

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) } }


Ni FileUtils.copyDirectory() ni los atributos del directorio de copia de respuesta de Archimedes (propietario del archivo, permisos, tiempos de modificación, etc.).

https://.com/a/18691793/14731 proporciona una solución completa JDK7 que hace precisamente eso.


Si estás abierto a usar una biblioteca de terceros, echa un vistazo a javaxt-core . La clase javaxt.io.Directory se puede usar para copiar directorios como este:

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

También puede proporcionar un filtro de archivos para especificar qué archivos desea copiar. Hay más ejemplos aquí:

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


FileUtils.copyDirectory()

Copia un directorio completo a una nueva ubicación conservando las fechas del archivo. Este método copia el directorio especificado y todos sus directorios y archivos secundarios al destino especificado. El destino es la nueva ubicación y el nombre del directorio.

El directorio de destino se crea si no existe. Si el directorio de destino existió, este método combina la fuente con el destino, con la fuente tomando precedencia.

Para hacerlo, aquí está el código de ejemplo

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(); }


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(); } } } }