2010-02-26 9 views
18

Tôi đang sử dụng org.apache.commons.net.ftp.FTPClient trong một trong các ứng dụng của mình để làm việc với máy chủ FTP. Tôi có thể connect, login, pwdcwd. Tuy nhiên, khi tôi cố gắng để list các tập tin nó không trả về danh sách các tập tin trong thư mục đó, nơi tôi biết chắc chắn rằng có các tập tin. Tôi đang sử dụng phương thức FTPFile[] listFiles(), nó trả về một mảng trống là FTPFile.Apache Commons FTPClient.listFiles

Hãy tìm thấy bên dưới đoạn mã nơi tôi đang cố gắng này:

 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

Tôi đã gặp phải vấn đề tương tự. Cảm ơn bạn đã đăng bài này. –

+0

Có thể trùng lặp của [Apache Commons Net FTPClient và listFiles()] (http://stackoverflow.com/questions/2712967/apache-commons-net-ftpclient-and-listfiles) – approxiblue

Trả lời

1

Chỉ cần một gợi ý ngớ ngẩn ... bạn có thể làm một danh sách trên/uploads folder bằng cách sử dụng FTP client bình thường. Tôi hỏi điều này vì một số máy chủ FTP được thiết lập để không hiển thị danh sách thư mục tải lên.

+0

Có tất nhiên! :) – Shyam

1

Trước tiên, hãy đảm bảo danh sách hoạt động trong các chương trình khác. Nếu có, một khả năng là danh sách tệp không được phân tích cú pháp chính xác. Bạn có thể thử chỉ định rõ ràng trình phân tích cú pháp để sử dụng với initiateListParsing.

+0

Có - ví dụ, hàm FTPFileListParser được truyền vào các dòng giả định listFilemight phải là một độ dài nhất định, sau đó bỏ lỡ tất cả các tệp trên một máy chủ có thực thi khác nhau của lệnh LIST. – Noumenon

5

Sau khi tôi đặt chế độ là PASV, hiện tại nó đang hoạt động tốt! Cảm ơn mọi nỗ lực và đề xuất của bạn!

1

tôi phải cùng một vấn đề và nó bật ra được rằng nó không thể phân tách những gì các máy chủ đã trở lại để có danh sách tệp. Tôi dòng này sau khi kết nối với máy chủ ftp ftpClient.setParserFactory (mới 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

Tương tự, mã tôi đã xem xét được gọi là trình phân tích cú pháp tùy chỉnh mỗi lần thay vì cho phép trình phân tích cú pháp tự động phát hiện khi loại hệ thống là Unix bình thường. – Noumenon

0

tôi thêm client.enterLocalPassiveMode() và nó hoạt động:

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