Question

La méthode listFiles() de org.apache.commons.net.ftp.FTPClient fonctionne très bien avec le serveur Filezilla sur 127.0.0.1, mais retourne null dans le répertoire racine des serveurs FTP publics tels que belnet.be.

Il y a une question identique sur le lien ci-dessous, mais enterRemotePassiveMode() ne semble pas aider. Apache Commons FTPClient.listFiles

Pourrait-il être un problème avec l'analyse de la liste? Si oui, comment s'y prendre pour résoudre ce?

Edit: Voici un vidage de cache du répertoire:

Répertoire FileZilla Cache Dump

Dumping 1 répertoires mises en cache

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

Voici mon code à l'aide d'une enveloppe que je l'ai fait (essai dans l'emballage produit les mêmes résultats):

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" );
    }
}

produit cette sortie:

Connected to FTP
Login succesful
utils.ftp.FTPClientManager$Connection$LoggedInManager@156ee8e
null
No files found
Disconnection successful

A l'intérieur de l'enveloppe (tentative utilisant à la fois listNames() et 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;
        }

En ce qui concerne ClientFTP, elle est traitée comme suit:

public class FTPUtils {

private FTPClientManager clientManager;

public FTPClientManager getFTPClientManager(){
    clientManager = new FTPClientManager();
    clientManager.setClient( new FTPClient() );

    return clientManager;
}
Était-ce utile?

La solution

Chaque serveur FTP a une mise en page de la liste des fichiers différents (oui, il ne fait pas partie de la norme FTP, il est muet), et donc vous devez utiliser le FTPFileEntryParser correct, que ce soit en spécifiant manuellement, ou en permettant CommonsFTP de détecter automatiquement il.

Auto-détection fonctionne généralement bien, mais parfois, il ne fonctionne pas, et vous devez le spécifier explicitement, par exemple.

FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);

FTPClient client = FTPClient();
client.configure(conf);

Ceci définit explicitement le type de serveur FTP prévu pour UNIX. Essayez les différents types, voir comment ça se passe. J'ai essayé de trouver moi-même, mais ftp.belnet.be refuse mes connexions: (

scroll top