ftpClient.listFiles("путь") с мейнфреймом

Я пытался получить файлы с FTP-сервера мэйнфрейма, поэтому я использовал этот метод org.apache.commons.net.ftp.FTPClient:

FTPClient ftpClient = ......
ftpClient.listFiles("path")

скажем, каталог был "AAAA.BBBB.CCCC.DDDD":

ftpClient.changeWorkingDirectory("..");
FTPFile[] files = ftpClient.listFiles("AAAA.BBBB.CCCC.DDDD");

Когда я распечатаю

files.length

результат 1. Не имеет значения, файл это или папка, результат все равно 1. Я хочу знать, почему.

Мой тест на обычном не-мейнфрейме ftp с использованием имени папки и имен файлов работал нормально.

Я хочу знать:

Как правильно обойти каталог в мейнфрейме ftp.

2 ответа

Решение

В z/OS доступны две файловые системы. Одна из них - это "классическая" файловая система (мой термин, я не знаю, как IBM различает), которая уходит корнями в полвека назад к OS / 360, другая более поздняя и совместима с Unix.

Вы используете "классическую" файловую систему. Там нет каталогов. Иногда в клиенте FTP есть синтаксический сахар, который делает квалификаторы имен набора данных (части "AAAA" и "BBBB" между точками) похожими на каталоги. Это не так.

Я предлагаю вам использовать подстановочные знаки в аргументе к вашему listFiles метод. Посмотрите, получит ли "AAAA.BBBB.CCCC.DDDD.**" то, что вы ожидаете.

Еще можно попробовать передать аргумент "AAAA.BBBB.CCCC" вашему changeWorkingDirectory метод.

В зависимости от реализации библиотеки, которую вы используете, любой из вышеперечисленных может сделать эквивалент команды ISPF DSLIST.

Я исследовал эту проблему с мэйнфреймом клиента совсем недавно, и рабочим решением было сначала добавить DefaultFtpSessionFactory со следующей конфигурацией:

<bean class="org.springframework.integration.ftp.session.DefaultFtpSessionFactory">
   <property name="host" value="???.???.???.???" />
   <property name="port" value="21" />
   <property name="username" value="ftp" />
   <property name="password" value="ftp" />
   <property name="config">
      <bean class="org.apache.commons.net.ftp.FTPClientConfig">
         <constructor-arg value="MVS" />
      </bean>
   </property>
</bean>

filePattern, который мы используем для объекта сеанса, это "FILE.FILE.FILE.FILE.FILE.**" (включая одинарные кавычки)

Java-код для получения списка файлов

Session<FTPFile> session = factory.getSession();
FTPFile[] files = session.list("'FILE.FILE.FILE.FILE.FILE.**'");
Другие вопросы по тегам