FTPClient FTPFile Сведения о файле недоступны - PullRequest
1 голос
/ 28 мая 2020

Я пытаюсь получить список файлов с удаленного FTP-сервера. ftpClient.listFiles() вернул null, и мне пришлось установить setUnparseableEntries на true, чтобы получить список файлов. Даже в этом случае список файлов не содержит никакой информации, такой как имя, и только информация, которую он имеет, - это rawlisting, а другие - нулевые. Поэтому я не могу сделать 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 показывает список файлов, но имя, дата изменения пусты и имеют значение только в rawlisting в формате «04-01-20 11:31 AM 8975 test.TXT». Итак, как получить имя и дату изменения из необработанного списка и почему я не смог получить FTPFile имя, используя getName

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;

}

1 Ответ

1 голос
/ 29 мая 2020
04-01-20 11:31AM 8975 test.TXT

Довольно необычный формат. Таким образом, возможно, что библиотека Apache Commons Net не сможет проанализировать его с конфигурацией по умолчанию.

Возможно, вам потребуется явно указать один из доступных синтаксических анализаторов. Доступные парсеры находятся в src\main\java\org\apache\commons\net\ftp\parser. Или, если нет синтаксического анализатора, специально совместимого с вашим сервером, вам может потребоваться создать свой собственный (вы можете основать его на ConfigurableFTPFileEntryParserImpl).

Хотя на самом деле для специального решения c проще было бы будь то вы просто проанализируете "rawlisting", который у вас уже есть.

...