2012-05-23 93 views
6

Necesito copiar un directorio del disco local a un servidor. El directorio contiene una gran cantidad de directorios, subdirectorios y archivos. (Piense en un árbol jerárquico de directorios).Copie todos los directorios al servidor por FTP usando Java

Aquí se muestra un ejemplo para copiar un archivo:

public void saveFilesToServer() throws IOException { 
    FTPClient ftp = new FTPClient(); 
    ftp.connect(ftp.foobar.com); 
    if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { 
     ftp.disconnect(); 
     log.fatal("FTP not disconnected"); 
    } 

    ftp.login("foo", "qwerty"); 
    log.info("Connected to server ."); 
    log.info(ftp.getReplyString()); 
    ftp.changeWorkingDirectory("test"); 
    ftp.makeDirectory("somedir"); 
    ftp.changeWorkingDirectory("somedir"); 
    ftp.setFileType(FTPClient.BINARY_FILE_TYPE);  
    java.io.File srcFolder = new java.io.File(folderPath);  
    FileInputStream fis = new FileInputStream(srcFolder); 
    ftp.storeFile (fileName, fis); 
    ftp.disconnect(); 
    log.info("FTP disconnected"); 
} 

Ahora, necesito copiar un directorio (somedir) con todos los subdirectorios y archivos de somedir.

Creo que el algoritmo debería usar recursividad. ¿Alguien sabe cómo?

+0

+1 por útil ¡Pregunta! –

Respuesta

10

El siguiente es un ejemplo de una solución recursiva para el problema:

public void saveFilesToServer(String remoteDest, File localSrc) throws IOException { 
    FTPClient ftp = new FTPClient(); 
    ftp.connect("ftp.foobar.com"); 
    if (!FTPReply.isPositiveCompletion(ftp.getReplyCode())) { 
     ftp.disconnect(); 
     log.fatal("FTP not disconnected"); 
    } 

    ftp.login("foo", "qwerty"); 
    log.info("Connected to server ."); 
    log.info(ftp.getReplyString()); 

    ftp.changeWorkingDirectory(remoteDest); 
    ftp.setFileType(FTPClient.BINARY_FILE_TYPE); 

    try { 
     upload(localSrc, ftp); 
    } 
    finally { 
     ftp.disconnect(); 
     log.info("FTP disconnected");   
    } 
} 

public void upload(File src, FTPClient ftp) throws IOException { 
    if (src.isDirectory()) { 
     ftp.makeDirectory(src.getName()); 
     ftp.changeWorkingDirectory(src.getName()); 
     for (File file : src.listFiles()) { 
      upload(file, ftp); 
     } 
     ftp.changeToParentDirectory(); 
    } 
    else { 
     InputStream srcStream = null; 
     try { 
      srcStream = src.toURI().toURL().openStream(); 
      ftp.storeFile(src.getName(), srcStream); 
     } 
     finally { 
      IOUtils.closeQuietly(srcStream); 
     } 
    } 
} 

IOUtils es una parte de Apache Commons IO.

+0

Se ve bien, lo verificaré. ¡Gracias! – lolo

+0

me han ayudado a pesar de que codigo en C++. ¡Algoritmo es lo mismo! –

-1
upload(fileName){ 
    If (filename is not dir){ 
    ftpFile(); 
    return; 
} 
listoffiles = get the list of all files in dir 
    for each file : listoffiles { 
    upload(file) 
} 

}

Cuestiones relacionadas