2012-05-23 14 views
6

का उपयोग कर सभी निर्देशिकाओं को एफ़टीपी द्वारा सर्वर पर कॉपी करें मुझे स्थानीय डिस्क से किसी सर्वर को एक निर्देशिका में कॉपी करने की आवश्यकता है। निर्देशिका में कई निर्देशिकाएं, उपनिर्देशिका, और फ़ाइलें शामिल हैं। (निर्देशिकाओं के पदानुक्रम के पेड़ के बारे में सोचें)।जावा

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

ने मुझे मदद की है हालांकि मैं सी ++ में कोड करता हूं। एल्गोरिदम बस वही है! –

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

}