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"。
我正在尝试从远程 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"。