Copiar directorio con Java

13/Sep/2011 Java , , , , 12 Comentarios

Con el siguiente código vamos a ver como podemos copiar el contenido de un directorio en otro utilizando el lenguaje Java.

Para poder copiar directorio con Java lo primero será entender la idea de cómo resolver el problema de la copia de directorios con Java. La cuestión es que no podemos ejecutar una copia tal cual del directorio ya que dicho directorio puede albergar contenido. Además dicho contenido puede ser a su vez otro directorio con más contenido.

Con esto vemos que lo que necesitamos es hacer un programa Java recursivo que vaya recorriendo cada directorio y copiando todo su contenido de uno a otro.

Lo primero será definir el interface de nuestro método que sirve para copiar directorios.

  1. public static void copiarDirectorios(File d1, File d2){...}

El método controlará la recursividad comprobando si el fichero que llega en primer lugar es un directorio, ya que si no lo es asumirá que es un fichero y procederá a su copia.

Es decir, la estructura del programa Java quedará de la siguiente forma:

  1. public static void copiarDirectorios(File d1, File d2){
  2. if (d1.isDirectory()){
  3. // Recorremos recursivamente el directorio
  4. else
  5. // Copiamos d1 a d2, ya que serán ficheros
  6. }
  7. }

La parte de cómo se copia un fichero en otro la explicamos en el ejemplo de Copiar ficheros con Java.

Si bien pegamos aquí el código Java para que quede como referencia:

  1. public static void copiarFicheros(File f1, File f2){
  2.  
  3. try {
  4.  
  5. byte[] buf = new byte[1024];
  6. int len;
  7.  
  8. while ((len = in.read(buf)) > 0) {
  9. out.write(buf, 0, len);
  10. }
  11.  
  12. in.close();
  13. out.close();
  14.  
  15. } catch (IOException ioe){
  16. ioe.printStackTrace();
  17. }
  18. }

Ahora pasamos a recorrer el contenido del directorio. Lo primero que tenemos que hacer es la creación del directorio destino. Eso sí, si el directorio no existe. Aquí jugamos con el método .exits() para ver si existe el directorio y .mkdir() para ayudarnos a crear el directorio.

  1. if (!d2.exists()){
  2. d2.mkdir();
  3. System.out.println("Creando directorio " + d2.toString());
  4. }

Una vez creado el directorio destino recorremos el directorio origen y procedemos a la copia. Hay que recordar que la lista de ficheros que contiene un directorio nos la proporciona el método .list(). Dicho método nos devuelve un array de String, el cual recorreremos.

  1. String[] ficheros = d1.list();
  2. for (int x=0;x<ficheros.length;x++) {
  3. copiarDirectorios(new File(d1,ficheros[x]),new File(d2,ficheros[x]));
  4. }

Por cada fichero volvemos a llamar a nuestro método copiarDirectorios de forma recursiva. Si lo que le pasamos es un directorio volverá a realizar la misma operación. Si lo que le pasamos son ficheros, directamente los copiará.

Espero que os haya gustado el ejemplo de cómo copiar directorio con Java.

Vídeos sobre Java


Difunde el Conocimiento

Si te ha gustado el artículo o te ha sido de utilidad, no dejes de compartirlo con tus amigos en las redes sociales... Te estaremos muy agradecidos. :-D

12 comentarios en “Copiar directorio con Java”

Víctor Cuervo

Jordi

Para el error de recursividad sugiero poner antes de crear el directorio que tome la lista:

String[] ficheros = d1.list();
if (!d2.exists()){
d2.mkdir();
}

Y en principio ya no debería dar problema.

Víctor Cuervo

Víctor Cuervo

Correcto, ese sería el enfoque.

Saludos.

Víctor Cuervo

emilio

El código no contempla un error recursivo,por ejemplo copiar la carpeta en una subcarpeta,por ejemplo:

File d1 = new File(“carpeta”);
File d2 = new File(“carpeta/carpeta”);
copiarDirectorios(d1, d2);

Ya que en esta parte:

// Comprobamos si existe el directorio destino, si no lo creamos
if (!d2.exists()) {
d2.mkdir();
System.out.println(“Creando directorio ” + d2.toString());
}
// Sacamos todos los ficheros del directorio
String[] ficheros = d1.list();

Crea un directorio y luego lo lee,si es el mismo crea muchos directorios internos hasta que la pila se rompe,o cancelemos la ejecución.

Saludos.

Víctor Cuervo

sebastian

que tal si se copia un directorio utilizando los comando del shell alguien ha tendio resultado de ese modo?????

Víctor Cuervo

Víctor Cuervo

@Adolfo Soberanis,

Valdría con comprobar si existen los ficheros antes de realizar la copia. Si te descargas el código completo verás que hay una linea que pone…

copiarFicheros(d1,d2);

Si quieres evitar la copia si ya existe el fichero, valdría con poner algo así como…

if (!d2.exists())
  copiarFicheros(d1,d2);

Espero que esto te sirva.

Saludos.

Víctor Cuervo

Adolfo Soberanis

Muchas gracias por tu ayuda… de hecho ya he leido ese metodo (.exists), mi problema es que no se como ir comparando en “paralelo” es decir, que compare la estructura con sus respectivos archivos y subcarpetas de origen al mismo tiempo que con destino o como seria?

De antemano, gracias.

Víctor Cuervo

Víctor Cuervo

@Adolfo Soberanis,

Puedes chequear si el fichero existe mediante el método .exists()
http://www.w3api.com/wiki/Java:File.exists()

Saludos.

Víctor Cuervo

Adolfo Soberanis

Hola Victor o cualquier otro amigo que pueda ayudarme… como podria adaptarse este codigo si quisiera que antes de copiar los archivos verificara si estos ya existen en la carpeta destino? es decir, comparar los directorios y archivos de cada subdirectorio de ORIGEN contra los directorios y archivos de subdirectorios de DESTINO, en caso que ORIGEN ya existe en DESTINO que no haga nada, si no que cree los directorios y subdirectorios correspondientes en Destino y copie sus respectivos archivos (Una especie de Sincronizador solamente), lo mismo si en ORIGEN o DESTINO cambio alguno en tamaño (lenght) o fecha de modificacion (lastModified), ojala pudieras ayudarme…

De antemano, MUCHAS GRACIAS.

Saludos.

Víctor Cuervo

Víctor Cuervo

@Eddie,

Me alegro que te haya funcionado perfectamente el código y que te haya servido.

Víctor Cuervo

Eddie

Excelente código, funciona al 100%…mejor, imposible.

Víctor Cuervo

Víctor Cuervo

@Arturo Tena, ¿Te refieres al File.walkFileTree?

Víctor Cuervo

Arturo Tena

Creo que en Java 7 ya hay un método que hace lo mismo. O al menos, un iterador recursivo.

¿Algo que nos quieras comentar?

Déjanos tu comentario, no te preocupes que tu email no será publicado

*

*