2012-05-23 19 views
6

Ho bisogno di copiare una directory dal disco locale a un server. La directory contiene molte directory, sottodirectory e file. (Pensa ad un albero gerarchico di directory).Copia tutte le directory sul server tramite FTP utilizzando Java

Ecco un esempio per copiare un file:

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

Ora, ho bisogno di copiare una directory (somedir) con tutte le sottodirectory e file di somedir.

Penso che l'algoritmo dovrebbe utilizzare la ricorsione. Qualcuno sa come?

+0

+1 per la domanda utile! –

risposta

10

Il seguente è un esempio di una soluzione ricorsiva al 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 è parte di Apache Commons IO.

+0

Sembra buono, lo controllerò. Grazie! – lolo

+0

mi hanno aiutato anche se codice in C++. Algoritmo è lo stesso! –

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

}

Problemi correlati