Muy buenas gente,
hoy vamos a ver otro pequeño proceso que en este caso en lugar de borrar como el anterior se usará para copiar directorios de forma recursiva. Con esto quiero decir que le damos un directorio origen y un destino, y nuestro método creará el destino si no existe y toda la estructura de directorios que contenga. Además, también realizará una copia de todos y cada uno de los ficheros que vaya encontrando en todo el proceso.

/**
 * Copiar un directorio y todo su contenido de forma recursiva
 * @param origen
 * @param destino
 */
private void copiarDirectorio(String origen, String destino) {
    comprobarCrearDirectorio(destino);
    File directorio = new File(origen);
    File f;
    if (directorio.isDirectory()) {
        comprobarCrearDirectorio(destino);
        String [] files = directorio.list();
        if (files.length > 0) {
            for (String archivo : files) {
                f = new File (origen + File.separator + archivo);
                if(f.isDirectory()) {
                    comprobarCrearDirectorio(destino+File.separator+archivo+File.separator);
                    copiarDirectorio(origen+File.separator+archivo+File.separator, destino+File.separator+archivo+File.separator);
                } else { //Es un archivo
                    copiarArchivo(origen+File.separator+archivo, destino+File.separator+archivo);
                }
            }
        }
    }
}

Como podéis ver, este proceso llama a copiar archivo. Este es el código necesario para copiar dos archivos dadas sus rutas absolutas.

/**
 * Copia el archivo origen en el destino
 * @param sOrigen
 * @param sDestino
 */
private void copiarArchivo(String sOrigen, String sDestino) {
    try {
        File origen = new File(sOrigen);
        File destino = new File(sDestino);
        InputStream in = new FileInputStream(origen);
        OutputStream out = new FileOutputStream(destino);

        byte[] buf = new byte[1024];
        int len;

        while ((len = in.read(buf)) > 0) {
            out.write(buf, 0, len);
        }

        in.close();
        out.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Y por último, el proceso que podemos usar para comprobar si cierto directorio existe, y en caso contrario crearlo para evitar problemas y excepciones.

/**
 * Comprueba si un directorio existe, y en caso contrario crea toda la ruta necesaria para que exista
 * @param ruta
 */
private void comprobarCrearDirectorio(String ruta) {
    File directorio = new File(ruta);
    if (!directorio.exists()) {
        directorio.mkdirs();
    }
}

Este es un proceso muy poderoso. Tened en cuenta que copiará todo, manteniendo todas las propiedades y características, de modo que si no andáis con cuidado podríais llegar copiar el disco duro entero. Lo que sería muy gracioso y tardaría bastante…

Como en el caso anterior, me gustaría decir que aunque en el título se indica que el algoritmo es para Windows es por el único motivo de que ha sido en el único sistema operativo que lo he probado. Dada la naturaleza de Java, su ejecución no debería tener ningún inconveniente en cualquier otra plataforma.

Espero que os sea útil y hasta otra ocasión.

Saludos,
Lázarus Surazal.

Entradas relacionadas

Perfil
prLázarus logo info
Carlos J. Peláez Rivas (Lázarus Surazal)
Graduado y Máster en Ingeniería Informática por la Universidad de Málaga. Actualmente trabajando como desarrollador de aplicaciones en Java usando Vaadin.
Apasionado de los videojuegos, la música y alguna que otra tecnología, siempre buscando cosas nuevas que aprender y hacer.
Más sobre mi...
Contacto
Notificaciones