6

ディレクトリをローカル ディスクからサーバーにコピーする必要があります。ディレクトリには、多くのディレクトリ、サブディレクトリ、およびファイルが含まれています。(ディレクトリの階層ツリーを考えてください)。

1 つのファイルをコピーする例を次に示します。

 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

アルゴリズムは再帰を使用する必要があると思います。誰かが方法を知っていますか?

4

2 に答える 2

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の一部です。

于 2012-05-23T12:28:38.973 に答える
-2
upload(fileName){
  If (filename is not dir){
   ftpFile();
   return;
 }
 listoffiles = get the list of all files in dir 
    for each file : listoffiles {
    upload(file)
 }

}

于 2012-05-23T11:23:46.957 に答える