Buscar en ELMED

domingo, 27 de mayo de 2012

Copiar Ficheros o Carpetas con Java

La siguiente es una clase que nos permite copiar un directorio completo o un simple archivo usando java.
Antes de comenzar recuerdo a los usuarios de windows cambiar el "/" por "\\"
Comencemos por la función main() que llama al método recursivo
  
public static int  EntraIncial=0;    
public static void main(String[] args) {
        //Fichero desde el cual se van a copiar los datos
        File FOrigen=new File("/home/luis/FRUTAS");
        //Fichero donde se van a copiar los datos
        File FDestino=new File("/home/luis/XXX");
        Copiar(FOrigen,FDestino);
        EntraIncial=0;   
}

  

/* Método que copia completamente una carpeta usando recursividad
 *PARAMETRO1:FOrigen:Fichero o carpeta que se desea copiar
 *PARAMETRO2:FDestino:Carpeta destino
 */
public static void Copiar(File FOrigen,File FDestino){
        //si el origen no es una carpeta
        if(!FOrigen.isDirectory()){
            //Llamo la funcion que lo copia
            CopiarFichero(FOrigen,FDestino);
        }else{
           //incremento el contador de entradas a esta función 
           EntraIncial++; 
           //solo se entra acá cuando se quiera copiar una carpeta y 
           //sea la primera es decir la carpeta padre
           if(EntraIncial==1){
                //Cambio la ruta destino por el nombre que tenia mas el nombre de
                //la carpeta padre
                FDestino=new File(FDestino.getAbsolutePath()+"/"+FOrigen.getName()); 
                //si la carpeta no existe la creo
                if(!FDestino.exists()){
                    FDestino.mkdir();
                }
           } 
           //obtengo el nombre de todos los archivos y carpetas que 
           //pertenecen a este fichero(FOrigen)
           String []Rutas=FOrigen.list();
           //recorro uno a uno el contenido de la carpeta
           
           /*IMPORTANTE:EL HML SE DESCONFIGURA Y NO ME DEJA 
             PORNE LA LINEA FOR SIGUIENTE BIEN, TENGO PROBLEMA 
             CON EL SIGNO MENOR.SI UD LE PASA LO MISMO DESCARGE EL
             PROGRAMA CON EL LINK DE ABAJO Y VÉALO DE FORMA SEGURA           
           */
             for(int i=0;i<Rutas.length;i++){
              //establezco el nombre del nuevo archivo origen 
              File FnueOri=new File(FOrigen.getAbsolutePath()+"/"+Rutas[i]);
              //establezco el nombre del nuevo archivo destino 
              File FnueDest= new File(FDestino.getAbsolutePath()+"/"+Rutas[i]);
              //si no existe el archivo destino lo creo
              if(FnueOri.isDirectory() && !FnueDest.exists()){
                  FnueDest.mkdir();                        
              }
              //uso recursividad y llamo a esta misma funcion has llegar
              //al ultimo elemento    
              Copiar(FnueOri,FnueDest); 
           }
        }
        
} 
  
/*Funcio que copia un fichero
 *PARAMETRO1:FOrigen:Fichero o carpeta que se desea copiar
 *PARAMETRO2:FDestino:Carpeta destino
 */
public static void CopiarFichero(File FOrigen,File FDestino){
            try {
            //Si el archivo a copiar existe
            if(FOrigen.exists()){
                String copiar="S";
                //si el fichero destino ya existe
                if(FDestino.exists()){
                   System.out.println("El fichero ya existe, Desea Sobre Escribir:S/N ");
                   copiar = ( new BufferedReader(new InputStreamReader(System.in))).readLine();
                }
                //si puedo copiar
                if(copiar.toUpperCase().equals("S")){
                    //Flujo de lectura al fichero origen(que se va a copiar)            
                    FileInputStream LeeOrigen= new FileInputStream(FOrigen);
                    //Flujo de lectura al fichero destino(donde se va a copiar)
                    OutputStream Salida = new FileOutputStream(FDestino);
                    //separo un buffer de 1MB de lectura
                    byte[] buffer = new byte[1024];
                    int tamaño;
                    //leo el fichero a copiar cada 1MB
                    while ((tamaño = LeeOrigen.read(buffer)) > 0) {
                    //Escribe el MB en el fichero destino
                    Salida.write(buffer, 0, tamaño);
                    }
                    System.out.println(FOrigen.getName()+" Copiado con Exito!!");
                    //cierra los flujos de lectura y escritura
                    Salida.close();
                    LeeOrigen.close();
                }
                
            }else{//l fichero a copiar no existe                
                System.out.println("El fichero a copiar no existe..."+FOrigen.getAbsolutePath());
            }
            
        } catch (Exception ex) {
            System.out.println(ex.getMessage());
        
       }
    
    
}
Bueno el ejemplo completo lo puedes descargar desde aquí. Acepto dudas,sugerencias o correcciones

4 comentarios:

  1. Muchas gracias me sirvió de mucho tu programa sigue así Saludos desde Colombia!

    ResponderEliminar
  2. Gracias.!!!! Excelente aporte a la comunidad Java.
    Chimbote-PERU.

    ResponderEliminar
  3. muy buen aporte, gracias

    ResponderEliminar