listFiles()
метод org.apache.commons.net.ftp.FTPClient
хорошо работает с сервером Filezilla на 127.0.0.1, но возвраты null
на корневом каталоге общедоступных FTP-серверов, таких как belnet.be.
Существует идентичный вопрос на ссылке ниже, но enterRemotePassiveMode()
кажется, не помогает. Apache Commons FTPClient.listFiles
Это могла быть проблема с парсингом списка? Если так, как может пойти о решении этого?
Править: Вот дамп кэша каталога:
Дамп кэша каталога FileZilla
Дамп 1 кэшируемого каталога
Entry 1:
Path: /
Server: anonymous@ftp.belnet.be:21, type: 4096
Directory contains 7 items:
lrw-r--r-- ftp ftp D 28 2009-06-17 debian
lrw-r--r-- ftp ftp D 31 2009-06-17 debian-cd
-rw-r--r-- ftp ftp 0 2010-03-04 13:30 keepalive.txt
drwxr-xr-x ftp ftp D 4096 2010-02-18 14:22 mirror
lrw-r--r-- ftp ftp D 6 2009-06-17 mirrors
drwxr-xr-x ftp ftp D 4096 2009-06-23 packages
lrw-r--r-- ftp ftp D 1 2009-06-17 pub
Вот мой код с помощью обертки, которую я сделал (тестирующий в обертке, приводит к тем же результатам):
public static void main(String[] args) {
FTPUtils ftpUtils = new FTPUtils();
String ftpURL = "ftp.belnet.be";
Connection connection = ftpUtils.getFTPClientManager().getConnection( ftpURL );
if( connection == null ){
System.out.println( "Could not connect" );
return;
}
FTPClientManager manager = connection.getFptClientManager();
FTPClient client = manager.getClient();
try {
client.enterRemotePassiveMode();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if( connection != null ){
System.out.println( "Connected to FTP" );
connection.login("Anonymous", "Anonymous");
if( connection.isLoggedIn() ){
System.out.println( "Login successful" );
LoggedInManager loggedin = connection.getLoggedInManager();
System.out.println( loggedin );
String[] fileList = loggedin.getFileList();
System.out.println( loggedin.getWorkingDirectory() );
if( fileList == null || fileList.length == 0 )
System.out.println( "No files found" );
else{
for (String name : fileList ) {
System.out.println( name );
}
}
connection.disconnect();
if( connection.isDisconnected() )
System.out.println( "Disconnection successful" );
else
System.out.println( "Error disconnecting" );
}else{
System.out.println( "Unable to login" );
}
} else {
System.out.println( "Could not connect" );
}
}
Производит этот вывод:
Connected to FTP
Login succesful
utils.ftp.FTPClientManager$Connection$LoggedInManager@156ee8e
null
No files found
Disconnection successful
В обертке (предпринятое использование обоих listNames()
и listFiles()
):
public String[] getFileList() {
String[] fileList = null;
FTPFile[] ftpFiles = null;
try {
ftpFiles = client.listFiles();
//fileList = client.listNames();
//System.out.println( client.listNames() );
} catch (IOException e) {
return null;
}
fileList = new String[ ftpFiles.length ];
for( int i = 0; i < ftpFiles.length; i++ ){
fileList[ i ] = ftpFiles[ i ].getName();
}
return fileList;
}
Что касается FTPClient, это обрабатывается следующим образом:
public class FTPUtils {
private FTPClientManager clientManager;
public FTPClientManager getFTPClientManager(){
clientManager = new FTPClientManager();
clientManager.setClient( new FTPClient() );
return clientManager;
}
Каждый FTP-сервер имеет разную структуру списка файлов (да, это не часть стандарта FTP, это глупо), поэтому вы должны использовать правильный FTPFileEntryParser
, либо указав его вручную, либо разрешив CommonsFTP автоматически определять его.
Автоопределение обычно работает нормально, но иногда нет, и вы должны указать это явно, например
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
FTPClient client = FTPClient();
client.configure(conf);
Это явно устанавливает ожидаемый тип FTP-сервера UNIX. Попробуйте разные виды, посмотрите, как получится. Я пытался выяснить это сам, но ftp.belnet.be
отказывается от моих подключений: (
Вы пробовали проверить, можно ли перечислить файлы с помощью обычного FTP-клиента? (По какой-то причине я даже не могу подключиться к FTP-порту "belnet.be".)
РЕДАКТИРОВАТЬ
Согласно javadoc для listFiles () , синтаксический анализ выполняется с помощью Экземпляр FTPFileEntryParser , предоставленный фабрикой синтаксического анализатора. Вероятно, вам нужно выяснить, какой из анализаторов соответствует выходным данным СПИСКА FTP-сервера, и соответствующим образом настроить фабрику.