2010-02-26 16 views
18

Ich verwende org.apache.commons.net.ftp.FTPClient in einer meiner Anwendungen mit einem FTP-Server arbeiten. Ich bin in der Lage zu connect, login, pwd und cwd. Wenn ich die Dateien list versuche, gibt es jedoch nicht die Liste der Dateien in diesem Verzeichnis zurück, wo ich sicher weiß, dass es Dateien gibt. Ich verwende die Methode FTPFile[] listFiles(), es gibt ein leeres Array von FTPFile zurück.Apache Commons FTPClient.listFiles

finden Sie unter dem Code-Schnipsel, wo ich dies versuchen:

 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

Ich habe das gleiche Problem aufgetreten. Danke für das Posten. –

+0

Mögliches Duplikat von [Apache Commons Net FTPClient und listFiles()] (http://stackoverflow.com/questions/2712967/apache-common-net-ftpclient-and-listfiles) – approxiblue

Antwort

1

nur einen dummen Vorschlag ... Sie tun können, ist einen Eintrag auf dem/uploads Ordner, um ein normales FTP-Client. Ich frage das, weil einige FTP-Server so eingerichtet sind, dass sie die Auflistung eines Upload-Ordners nicht anzeigen.

+0

Ja natürlich! :) – Shyam

1

Zuerst sicherstellen, dass die Auflistung in anderen Programmen funktioniert. Wenn dies der Fall ist, besteht eine Möglichkeit darin, dass die Dateiliste nicht korrekt analysiert wird. Sie können versuchen, explizit den Parser anzugeben, der mit initiateListParsing verwendet werden soll.

+0

Ja - zum Beispiel die FTPFileListParser-Implementation, die an listFilemight übergeben wird annehmen, dass Zeilen eine bestimmte Länge haben müssen, dann verpassen Sie alle Dateien auf einem Server mit einer anderen Implementierung des LIST-Befehls. – Noumenon

5

Nachdem ich den Modus als PASV eingestellt habe, funktioniert es jetzt gut! Vielen Dank für all Ihre Bemühungen und Vorschläge!

1

ich gleiche Problem hatte und es stellte sich heraus, dass es nicht das, was der Server nicht analysieren kam für eine Dateiliste zurück. I diese Zeile nach der Verbindung mit dem FTP-Server 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

In ähnlicher Weise rief der von mir betrachtete Code jedes Mal einen benutzerdefinierten Parser auf, anstatt den Parser mit automatischer Erkennung zuzulassen, wenn der Systemtyp ein normaler Unix war. – Noumenon

0

Ich habe client.enterLocalPassiveMode() und es funktioniert:

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