Apache Commons FTPClient.listFiles

时间:2010-02-26 06:26:05

标签: java apache-commons ftp-client

我在我的某个应用程序中使用org.apache.commons.net.ftp.FTPClient来使用FTP服务器。我可以connectloginpwdcwd。但是,当我尝试list文件时,它不会返回该目录中的文件列表,我知道确实存在文件。我使用方法FTPFile[] listFiles(),它返回一个空数组FTPFile

请在下面找到我正在尝试此操作的代码段:

        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();

7 个答案:

答案 0 :(得分:17)

这似乎与我遇到的问题相同(并已解决),请参阅此答案:

Apache Commons Net FTPClient and listFiles()

答案 1 :(得分:6)

将模式设置为PASV后,它现在正常工作! 感谢您的所有努力和建议!

答案 2 :(得分:1)

只是一个愚蠢的建议......你可以使用普通的FTP客户端在/ uploads文件夹上进行列表吗?我问这个是因为有些FTP服务器被设置为不显示上传文件夹的列表。

答案 3 :(得分:1)

首先,确保列表在其他程序中有效。如果是这样,一种可能性是文件列表没有被正确解析。您可以尝试显式指定要与initiateListParsing一起使用的解析器。

答案 4 :(得分:1)

我遇到了同样的问题,事实证明它无法解析服务器为文件列表返回的内容。我在连接到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;
}

}

答案 5 :(得分:1)

我添加了client.enterLocalPassiveMode()并且有效:

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

答案 6 :(得分:0)

在我的情况下,除了应用 enterLocalPassiveMode 并指示正确的操作系统外,我还需要将 UnparseableEntries 设置为true才能使listFile方法起作用。

FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
conf.setUnparseableEntries(true);
f.configure(conf);
boolean isLoginSuccess = client.login(username, password);