2010-02-26 19 views
18

Używam org.apache.commons.net.ftp.FTPClient w jednej z moich aplikacji do pracy z serwerem FTP. Jestem w stanie connect, login, i cwd. Jednakże, gdy próbuję uzyskać list plików, które nie zwróci listę plików w tym katalogu, gdzie wiem na pewno, że istnieją pliki. Używam metody FTPFile[] listFiles(), zwraca pustą tablicę FTPFile.Apache Commons FTPClient.listFiles

Poniżej znajduje się fragment kodu, gdzie próbuję to:

 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

Napotkałem ten sam problem. Dzięki za zamieszczenie tego. –

+0

Możliwy duplikat [FTP FTPClient Apache Commons i listFiles()] (http://stackoverflow.com/questions/2712967/apache-commons-net-ftpclient-and-listfiles) – approxiblue

Odpowiedz

1

Tylko głupie sugestie ... można zrobić listę w folderze/przesyłanych przy użyciu normalnego klienta FTP. Pytam o to, ponieważ niektóre serwery FTP są skonfigurowane tak, aby nie wyświetlały listy folderów wysyłania.

+0

Tak, oczywiście! :) – Shyam

1

Najpierw upewnij się, że aukcja działa w innych programach. Jeśli tak, jedną z możliwości jest to, że lista plików nie jest poprawnie przetwarzana. Możesz spróbować jawnie określić analizator składni do użycia z initiateListParsing.

+0

Tak - na przykład, implentacja FTPFileListParser przekazywana do listFilemight zakłada, że ​​linie muszą mieć określoną długość, a następnie pomija wszystkie pliki na serwerze z inną implementacją polecenia LISTA. – Noumenon

5

Po ustawieniu trybu na PASV działa teraz prawidłowo! Dziękuję za wszystkie wysiłki i sugestie!

1

musiałem sam problem i okazało się, że nie można analizować co serwer wracał do listy plików. I to po połączeniu z serwerem 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

Podobnie, kod, który szukałem, za każdym razem wywoływał niestandardowy analizator składni, zamiast zezwalać na automatyczne analizowanie parsera, gdy typem systemu był normalny Unix. – Noumenon

0

dodałem client.enterLocalPassiveMode() i to działa:

client.connect("xxx.com"); 
boolean login = client.login("xxx", "xxx"); 
client.enterLocalPassiveMode(); 
Powiązane problemy