2013-11-29 4 views
2

У меня проблема с commons-net FTPClient. Если я загружу файл с моего ftp-сервера wirth retrieveFileStream(), он работает, но я получаю результат «150 Открытие соединения данных в режиме BINARY для ...». Если я вызову noop(), я получаю «226 Transfer complete» в качестве результата. Для каждой следующей операции я получаю результат отриной операции.commons-net FTPClient.retrieveFileStream() возвращает неверный результат

Я выяснил, что FTPClient читает результаты до конца строки, если есть две строки результата (как после retrieveFileStream()), я получаю второй после следующей команды. Я сделал обходной путь перекрывая FTPClient.retrieveFileStream(), как это:

public static void main(String[] args){ 
    try { 
     MyFTPClient ftpClient = new MyFTPClient(); 
     try { 
      ftpClient.connect(ftphost, 21); 
      if(!ftpClient.login(ftpuser, ftppassword)){ 
       throw new RuntimeException(ftpClient.getReplyString()); 
      } 
      if(!ftpClient.changeWorkingDirectory("in")){ 
       throw new RuntimeException(ftpClient.getReplyString()); 
      } 
      FTPFile[] files = ftpClient.listFiles(); 
      for(FTPFile file: files){ 
       if(file.getName().startsWith(FILENAME) && (file.getType() == FTPFile.FILE_TYPE)){ 
        InputStream in = ftpClient.retrieveFileStream(file.getName()); 
        CsvFile csvFile = new CsvFile(in, "ISO-8859-1", ';', "yyyyMMdd", "#.00", Locale.US, false); 
        in.close(); 
        in = null; 
        System.out.println(ftpClient.getReplyString()); 
        System.out.println(ftpClient.readLine()); 
        System.out.println(ftpClient.rnfr(file.getName())); 
        System.out.println(ftpClient.getReplyString()); 
        System.out.println(ftpClient.rnto("x" + file.getName())); 
        System.out.println(ftpClient.getReplyString()); 

       } 
      } 
      if(!ftpClient.logout()){ 
       throw new RuntimeException(ftpClient.getReplyString()); 
      } 
     } finally { 
      ftpClient.disconnect(); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

} 

private static class MyFTPClient extends FTPClient{ 
    public String readLine(){ 
     try { 
      __getReplyNoReport(); 
     } catch (IOException e) { 
     } 
     return getReplyString(); 
    } 
} 

Вызов метода ReadLine() получает мне дополнительную линию результата.

Но это ошибка FTPClient, или это проблема моего ftp-сервера? Проблема этого обходного пути заключается в том, что метод блокирует, если имеется только одна строка ответа.

Thanx за вашу помощь

Stephan

+0

Ранний образец кода был неправильным, я заменил его. –

+2

Иногда это помогает, читая руководство. Выполняется вызов completePendingCommand(). –

+0

Вы должны опубликовать это как ответ и принять его. Все в порядке, чтобы ответить на ваши вопросы. –

ответ

2

Иногда это помогает, читая руководство. Вызов completePendingCommand() работает

+0

Я не думаю, что вам так тяжело нужно пропустить это, это совершенно неочевидно, я тоже пропустил это при использовании '.retrieveFileStream' – shmish111

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