FTPClient FTPFile 详细信息不可用

FTPClient FTPFile details not available

我正在尝试从远程 FTP 服务器获取文件列表。 ftpClient.listFiles() 返回 null,我必须将 setUnparseableEntries 设置为 true 才能获取文件列表。即使这样,文件列表也没有任何信息,如名称,只有它拥有的信息是原始列表,其他信息为空。所以我做不到ftpFile.getName。这是代码

public FTPFile[] process() throws Exception {
 String message = null;
 FTPFile[] files = null;

 FTPClient ftpClient = new FTPClient();

 FTPClientConfig config = new FTPClientConfig();
 config.setServerTimeZoneId("America/Chicago");
 config.setUnparseableEntries(true);
 ftpClient.configure(config);

 if ( !connectToServer() ) return null;

 if ( !changeDirectory() ) {
    disconnectFromServer();
    return null;
 }
 files = getListofFiles();
 disconnectFromServer();

 return files;
}

private boolean connectToServer() {
 boolean result = true;
 String message = null, url = null;

 // attempt to connect to the target server
 try {
     url = fo.getServerInfo().getConnectionURL();
     LOGGER.debug("Connecting to: " + url);
     ftpClient.connect(fo.getServerInfo().getHostName(),
            fo.getServerInfo().getHostPort());
     ftpClient.enterLocalPassiveMode();
 } catch(SocketException e) {
     result = false;
     message = "Could not connect to server at " + url;
 } catch(IOException e) {
     result = false;
     message = "Could not connect to server at " + url;
 }
 if ( !result ) return result;

 // After connection attempt, you should check the reply code to verify success.
 Integer replyCode = ftpClient.getReplyCode();

 if ( !FTPReply.isPositiveCompletion(replyCode) ) {
    message = "Reply Code - " + replyCode.toString() + " is negative.";
    try {
        ftpClient.disconnect();
    } catch(Exception e) {
        message = "Could not disconnect cleanly from server.";
        LOGGER.error(message);
    }
 } else {
    message = "Reply Code - " + replyCode.toString() + " is positive.";
 }

 Boolean logonOk = false;
 try {
    logonOk = ftpClient.login(fo.getServerInfo().getUserName(), 
            fo.getServerInfo().getUserPassword());
 } catch(IOException e) {
    message = "IOException during logon attempt.";
    LOGGER.error(message);
 }
 if ( !logonOk ) {
    result = false;
    message = "Logon UNsuccessful.";
 } else {
    message = "Logon successful.";
    LOGGER.error(message);
    executionMessageLog.add(message);
 }

 if ( !result ) return result;

 // attempt to log onto the target server

 return result;
}

以下方法正在尝试获取文件列表。我可以使用 listNames 查看文件名,并且 listFiles 显示文件列表,但名称、修改日期为空,并且在原始列表中仅具有格式为“04-01-20 11:31AM 的值8975 test.TXT”。那么如何从原始列表中获取名称和修改日期以及为什么我无法使用 getName

获取 FTPFile 名称
private FTPFile[] getListofFiles(){
 String message = null;
 FTPFile[] files = null;
 try {
    String[] filenames = ftpClient.listNames(fileListInfo.getFilePath());
    files = ftpClient.listFiles(); /*Has only rawlisting and others are null*/
 }
 catch(IOException e) {
    message = "IOException during getListofFiles attempt:";
    LOGGER.error(message);
    executionMessageLog.add(message);
    message = e.getMessage();
    LOGGER.error(message);
    executionMessageLog.add(message);
 }
 return files;

}
04-01-20 11:31AM 8975 test.TXT

这种格式很不寻常。所以有可能 Apache Commons Net 库无法使用默认配置解析它。

您可能需要明确指定可用的解析器之一。可用的解析器在 src\main\java\org\apache\commons\net\ftp\parser 中。或者,如果没有专门与您的服务器兼容的解析器,您可能需要构建自己的解析器(您可以基于 ConfigurableFTPFileEntryParserImpl)。

虽然实际上,对于临时解决方案,更简单的方法是解析您已有的 "rawlisting"。