2012-05-23 30 views
6

我需要将目录从本地磁盘复制到服务器。 该目录包含许多目录,子目录和文件。 (想想目录的层次结构树)。使用Java通过FTP将所有目录复制到服务器

这里是拷贝一个文件的一个示例:

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

现在,我需要到一个目录(somedir)的所有子目录和somedir文件复制。

我认为算法应该使用递归。 有人知道如何?

+0

+1对于有用的问题! –

回答

10

下面是一个递归解决问题的方法的一个示例:

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

IOUtilsApache Commons IO的一部分。

+0

它看起来不错,我会检查它。谢谢! – lolo

+0

已经帮助我,虽然我在C++代码。算法是一样的! –

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

}

相关问题