2010-02-26 14 views
18

Estoy usando org.apache.commons.net.ftp.FTPClient en una de mis aplicaciones para trabajar con un servidor FTP. Puedo connect, login, pwd y cwd. Sin embargo, cuando trato de list los archivos, no devuelve la lista de archivos en ese directorio, donde sé con certeza que hay archivos. Estoy usando el método FTPFile[] listFiles(), devuelve una matriz vacía de FTPFile.Apache Commons FTPClient.listFiles

A continuación el fragmento de código en el que estoy tratando esto:

 String hostname = properties.getProperty("FTP_SERVER"); 
     String user = properties.getProperty("FTP_USER"); 
     String passwd = properties.getProperty("FTP_PASSWD"); 
     FTPClient client = new FTPClient(); 
     client.connect(hostname); 
     client.login(user, passwd); 
     String reply = client.getStatus(); 
     System.out.println(reply); 
     client.enterRemotePassiveMode(); 
     client.changeWorkingDirectory("/uploads"); 
     FTPFile[] files = client.listFiles(); 
     System.out.println(files.length); 
     for (FTPFile file : files) { 
      System.out.println(file.getName()); 
     } 

     String[] fileNames = client.listNames(); 
     if (fileNames != null) { 
      for (String file : fileNames) { 
       System.out.println(file); 
      } 
     } 
     client.disconnect(); 
+0

que he encontrado el mismo problema. Gracias por publicar esto. –

+0

Posible duplicado de [Apache Commons Net FTPClient y listFiles()] (http://stackoverflow.com/questions/2712967/apache-commons-net-ftpclient-and-listfiles) – approxiblue

Respuesta

1

Sólo una sugerencia tonta ... se puede hacer un listado en los archivos/carpeta mediante un cliente FTP normales. Lo pregunto porque algunos servidores FTP están configurados para no mostrar la lista de una carpeta cargada.

+0

¡Sí, por supuesto! :) – Shyam

1

Primero, asegúrese de que la lista funcione en otros programas. Si es así, una posibilidad es que la lista de archivos no se esté analizando correctamente. Puede intentar especificar explícitamente el analizador para usar con initiateListParsing.

+0

Sí, por ejemplo, la implementación de FTPFileListParser que se pasa a listFilemight supone que las líneas deben tener una longitud determinada, y luego omiten todos los archivos en un servidor con una implementación diferente del comando LIST. – Noumenon

5

Después de establecer el modo como PASV ¡está funcionando bien ahora! ¡Gracias por todos sus esfuerzos y sugerencias!

1

tuve que mismo problema y resultó ser que no pudo analizar lo que el servidor estaba volviendo para una lista de archivos. I esta línea después de conectarme al servidor ftp ftpClient.setParserFactory (new MyFTPFileEntryParserFactory());

public class MyFTPFileEntryParserFactory implements FTPFileEntryParserFactory { 
private final static FTPFileEntryParser parser = new UnixFTPEntryParser() { 
    @Override public FTPFile parseFTPEntry(String entry) { 
     FTPFile ftpFile = new FTPFile(); 
     ftpFile.setTimestamp(getCalendar(entry)); 
     ftpFile.setSize(get(entry)); 
     ftpFile.setName(getName(entry)); 
     return ftpFile; 
    } 
}; 

@Override public FTPFileEntryParser createFileEntryParser(FTPClientConfig config) throws ParserInitializationException { 
    return parser; 
} 

@Override public FTPFileEntryParser createFileEntryParser(String key) throws ParserInitializationException { 
    return parser; 
} 

}

+0

De manera similar, el código que estaba mirando llamaba a un analizador personalizado cada vez en lugar de permitir el analizador de autodetección cuando el tipo de sistema era Unix normal. – Noumenon

0

añadí client.enterLocalPassiveMode() y funciona:

client.connect("xxx.com"); 
boolean login = client.login("xxx", "xxx"); 
client.enterLocalPassiveMode(); 
Cuestiones relacionadas