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.**'");