Скачать все папки рекурсивно с FTP-сервера в Java - PullRequest
0 голосов
/ 17 мая 2018

Я хочу загрузить (или, если хотите, синхронизировать) весь контент FTP-сервера с моим локальным каталогом.Я уже могу скачивать файлы и создавать каталоги на «первом слое».Но я не знаю, как реализовать подпапки и файлы в них.Я просто не могу получить рабочий цикл.Кто-нибудь может мне помочь?Заранее спасибо.

Вот мой код:

FTPFile[] files = ftp.listFiles();

for (FTPFile file : files){
    String name = file.getName();
    if(file.isFile()){
        System.out.println(name);
        File downloadFile = new File(pfad + name);
        OutputStream os = new BufferedOutputStream(new FileOutputStream(downloadFile));
        ftp.retrieveFile(name, os);
    }else{
        System.out.println(name);
        new File(pfad + name).mkdir();
    }

}

Я использую библиотеку Apache Commons Net.

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Просто поместите ваш код в метод и вызовите его рекурсивно, когда вы найдете (под) папку. Это будет делать:

private static void downloadFolder(
    FTPClient ftpClient, String remotePath, String localPath) throws IOException
{
    System.out.println("Downloading remote folder " + remotePath + " to " + localPath);

    FTPFile[] remoteFiles = ftpClient.listFiles(remotePath);

    for (FTPFile remoteFile : remoteFiles)
    {
        if (!remoteFile.getName().equals(".") && !remoteFile.getName().equals(".."))
        {
            String remoteFilePath = remotePath + "/" + remoteFile.getName();
            String localFilePath = localPath + "/" + remoteFile.getName();

            if (remoteFile.isDirectory())
            {
                new File(localFilePath).mkdirs();

                downloadFolder(ftpClient, remoteFilePath, localFilePath);
            }
            else
            {
                System.out.println("Downloading remote file " + remoteFilePath + " to " +
                    localFilePath);

                OutputStream outputStream =
                    new BufferedOutputStream(new FileOutputStream(localFilePath));
                if (!ftpClient.retrieveFile(remoteFilePath, outputStream))
                {
                    System.out.println("Failed to download file " + remoteFilePath);
                }
                outputStream.close();
            }
        }
    }
}
0 голосов
/ 17 мая 2018

Вы можете использовать FTPFile.isDirectory(), чтобы проверить, является ли текущий файл каталогом.Если это каталог FTPClient.changeWorkingDirectory(...) к нему и продолжить рекурсивно.

...