Apache Commons FTPClient.listFiles

20
我正在使用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();

我也遇到了同样的问题。感谢您发布这个。 - James P.
可能是Apache Commons Net FTPClient和listFiles()的重复问题。 - approxiblue
7个回答

20

6

我将模式设置为PASV后,现在一切都正常了!感谢您的所有努力和建议!


3

我添加了client.enterLocalPassiveMode(),现在它可以正常工作:

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

1

只是一个愚蠢的建议...您能否使用普通FTP客户端对/uploads文件夹进行列表显示。我之所以这样问,是因为有些FTP服务器设置为不显示上传文件夹的列表。


1

首先,请确保该列表在其他程序中可以正常工作。如果是这样,可能的原因之一是文件列表没有被正确解析。您可以尝试使用initiateListParsing显式指定要使用的解析器。


是的 - 例如,传递给listFile的FTPFileListParser实现可能假定行必须具有特定长度,然后错过具有不同LIST命令实现的服务器上的所有文件。 - Noumenon

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;
}

}


同样地,我所查看的代码在系统类型为普通Unix时,每次都调用了自定义解析器,而没有使用自动检测解析器。 - Noumenon

1
在我的情况下,除了应用enterLocalPassiveMode并指示正确的操作系统外,我还需要将UnparseableEntries设置为true,以使listFile方法工作。
FTPClientConfig conf = new FTPClientConfig(FTPClientConfig.SYST_UNIX);
conf.setUnparseableEntries(true);
f.configure(conf);
boolean isLoginSuccess = client.login(username, password);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接