2012-05-23 3 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)을 복사해야합니다 여기

하나 개의 파일을 복사하는 예입니다.

나는 알고리즘이 재귀를 사용해야한다고 생각한다. 누군가가 어떻게 알고 있습니까?

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

+1 유용한 질문! –

답변

10

다음은 문제점에 대한 순환 용액의 예이다.

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

}

관련 문제