FTPClient показывает пустую папку, когда в ней есть файлы

Я использую Apache Commons net FTPClient для входа в систему и чтения файлов с FTP-сервера. Мне удается войти в систему, и я вижу, что он успешно входит в систему, потому что он показывает путь к рабочему каталогу в строке заголовка. Однако он не показывает файлы, когда я использую listFiles(). (Я также пытался использовать listDirectories() и listNames(), но безуспешно) Ниже приведен фрагмент:

try {
        client.connect(ftpHost);
    } /*catch (SocketException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }*/ catch (IOException ex) {
        // TODO Auto-generated catch block
        ex.printStackTrace();
    }


    String header ="";
    InputStream stream=null;
    BufferedReader reader=null;
    try{
        client.login(ftpUser, ftpPass);
        client.changeWorkingDirectory(targetWorkingDir);
        header = client.printWorkingDirectory();
        //client.setFileType(FTP.BINARY_FILE_TYPE);
        for(int i=0; i<client.listFiles().length;i++){
            header+=client.listFiles()[i].getName() +"\n";
        }

    }
    catch (IOException ex){
        ex.printStackTrace();
        header="ERROR 1: " + ex.getMessage();
        for(int i=0;i<ex.getStackTrace().length;i++){
            header += "\n" + ex.getStackTrace()[i];
        }
    }
    catch(NullPointerException e){
        header = "ERROR 2: "+ e.getMessage()+"\n";
        for(int i=0;i<e.getStackTrace().length;i++){
            header+= e.getStackTrace()[i] + "\n";
        }
    }
    finally{
        if(reader!=null){
            try{reader.close();}catch(IOException e){e.printStackTrace();}
            try{stream.close();}catch(IOException e){e.printStackTrace();}
        }
    }

Я также пытался использовать что-то подобное для чтения файла:

try {
    stream = ftpClient.retrieveFileStream("klasa.csv");
    reader = new BufferedReader(new InputStreamReader(stream));
    header = reader.readLine();
} finally {
    if (reader != null) try { reader.close(); } catch (IOException logOrIgnore){}
}

В обоих случаях я почти уверен, что нахожусь в правильном каталоге, и я удостоверяюсь, что мой файл находится там через FileZilla, но клиент, похоже, не может прочитать какой-либо файл.


person SGj    schedule 24.06.2015    source источник
comment
Приложение может быть другим пользователем, у которого нет разрешения на просмотр файлов...   -  person Danielson    schedule 24.06.2015
comment
но приложение получает того же пользователя и пароль, что и FileZilla, и я вижу этот файл в FileZilla.   -  person SGj    schedule 24.06.2015


Ответы (1)


Старайтесь избегать вызова listFiles() в цикле. Каждый вызов будет выполнять всю последовательность команд FTP LIST, поэтому в конечном итоге вы будете добавлять ненужный трафик к каждому вызову.

Сначала вы можете попробовать упростить свою программу следующим образом:

private static  void ftpTest() {
    FTPClient f = new FTPClient();
    try {
        f.connect("{UOUR FTP SERVER}");
        f.login("{USER}", "{PASSWORD}");
        FTPFile[] files = f.listFiles(".");
        for (FTPFile fi: files) {
            System.out.printf("f%s\n", fi.getName());
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

Если эта программа не предоставит вам список файлов в корневом каталоге вашего сервера, вы можете попробовать сравнить параметры FTP FileZilla (в частности, режим PASSIVE/ACTIVE): https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#enterLocalPassiveMode()

Если это не поможет, вы можете попробовать перехватить сетевой трафик с помощью WireShark или tcpdump и сравнить набор команд с FTP-сервером.

person Vicctor    schedule 23.12.2018