2014-11-25 2 views
1

Я пытаюсь рекурсивно перебирать всю корневую директорию, к которой я прихожу после входа на ftp-сервер.Загрузить весь ftp-каталог Java (Apache Commons) - Сбой при первой попытке, после этого работает?

Я могу подключиться, все, что я действительно хочу сделать, там рекурсирует по всей структуре и загружает каждый файл и папку и имеет его в той же структуре, что и на ftp. То, что я до сих пор является рабочим методом загрузки, идет на сервер и получает всю мою структуру файлов, что является блестящим, за исключением того, что с первой попытки не удается, а затем работает во второй раз. Я получаю ошибку следующим образом:

java.io.FileNotFoundException: выход-каталог \ тест \ testFile.png (Система не может найти указанный путь)

мне удалось сделать загрузку функциональность каталога, который у меня есть локально, но не могу заставить загружать работу, после многочисленных попыток мне действительно нужна помощь.

Благодаря

EDIT: пример кода, я так далеко.

public static void download(String filename, String base) 
{ 
    File basedir = new File(base); 
    basedir.mkdirs(); 

    try 
    { 
     FTPFile[] ftpFiles = ftpClient.listFiles(); 
     for (FTPFile file : ftpFiles) 
     { 
      if (!file.getName().equals(".") && !file.getName().equals("..")) { 
       // If Dealing with a directory, change to it and call the function again 
       if (file.isDirectory()) 
       { 
        // Change working Directory to this directory. 
        ftpClient.changeWorkingDirectory(file.getName()); 
        // Recursive call to this method. 
        download(ftpClient.printWorkingDirectory(), base); 

        // Create the directory locally - in the right place 
        File newDir = new File (base + "/" + ftpClient.printWorkingDirectory()); 
        newDir.mkdirs(); 

        // Come back out to the parent level. 
        ftpClient.changeToParentDirectory(); 
       } 
       else 
       { 
        ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); 
        String remoteFile1 = ftpClient.printWorkingDirectory() + "/" + file.getName(); 
        File downloadFile1 = new File(base + "/" + ftpClient.printWorkingDirectory() + "/" + file.getName()); 
        OutputStream outputStream1 = new BufferedOutputStream(new FileOutputStream(downloadFile1)); 
        boolean success = ftpClient.retrieveFile(remoteFile1, outputStream1); 
        outputStream1.close(); 
       } 
      } 
     } 
    } 
    catch(IOException ex) 
    { 
     System.out.println(ex); 
    } 
} 
+0

Что вы попробуете и где не удалась? – RealSkeptic

+0

Добавлен код, который покажет вам мой текущий код, как он сидит. Спасибо за быстрый ответ. – Slippy

+0

Ну, что вы пробовали (не часть, которая работает, часть, которую вы сказали, что вы пробовали и провалили), и каким образом это провалилось? – RealSkeptic

ответ

1

Ваша проблема (ну, текущая проблема после того, как мы избавились от . и .., и вы получили мимо бинарного вопроса) является то, что вы делаете шаг рекурсии перед вызовом newDir.mkdirs().

Так что у вас есть дерево, как

. 
.. 
someDir 
    . 
    .. 
    someFile.txt 
someOtherDir 
    . 
    .. 
someOtherFile.png 

Что вы делаете это пропустить файлы точечных, видят, что someDir является каталогом, то сразу же зайти внутрь него, пропустите его точечные файлы, и увидеть someFile.txt, и обрабатывать его. Вы еще не создали someDir, поэтому вы получаете исключение.

Ваш обработчик исключений не останавливает выполнение, поэтому управление возвращается на верхний уровень рекурсии. На данный момент он создает каталог.

В следующий раз, когда вы запустите свою программу, локальный каталог someDir уже создан из предыдущего запуска, и вы не видите проблем.

В принципе, вы должны изменить свой код на:

  if (file.isDirectory()) 
      { 
       // Change working Directory to this directory. 
       ftpClient.changeWorkingDirectory(file.getName()); 

       // Create the directory locally - in the right place 
       File newDir = new File (base + "/" + ftpClient.printWorkingDirectory()); 
       newDir.mkdirs(); 

       // Recursive call to this method. 
       download(ftpClient.printWorkingDirectory(), base); 

       // Come back out to the parent level. 
       ftpClient.changeToParentDirectory(); 
      } 
+0

Спасибо за помощь! Это была лучшая помощь, которую я когда-либо получал при переполнении стека, вы заставили меня самостоятельно работать над моей проблемой и вносить необходимые изменения, которые мне нужны, когда я шел. Вместо того, чтобы просто получить кусок кода, я узнал несколько аккуратных новых вещей :) – Slippy

Смежные вопросы