我试图从大型机FTP服务器检索文件, 所以我使用的是org.apache.commons.net.ftp.FTPClient方法:
FTPClient ftpClient = ......
ftpClient.listFiles("path")
让我们说dir是“AAAA.BBBB.CCCC.DDDD”:
ftpClient.changeWorkingDirectory("..");
FTPFile[] files = ftpClient.listFiles("AAAA.BBBB.CCCC.DDDD");
当我打印出来
files.length
结果是1.无论是文件还是文件夹,结果仍然是1.我想知道原因。
我使用文件夹名称和文件名在普通的非大型机ftp上进行的测试工作正常。
我想知道:
如何正确遍历大型机ftp中的目录。
答案 0 :(得分:2)
z/OS有两种文件系统可用。一个是“经典”文件系统(我的术语,我不知道IBM如何区分),其根源可以追溯到半个世纪以前OS/360,另一个是更新的并且Unix兼容。
您正在使用“经典”文件系统。没有目录。有时在FTP客户端中有可用的语法糖,使得数据集名称限定符(点之间的“AAAA”和“BBBB”部分)看起来像目录。他们不是。
我建议你在listFiles
方法的参数中使用通配符。看看“AAAA.BBBB.CCCC.DDDD。**”是否能满足您的需求。
您可以尝试的其他方法是将参数“AAAA.BBBB.CCCC”传递给您的changeWorkingDirectory
方法。
根据您正在使用的库的实现,上述任何一个都可能与ISPF DSLIST命令相同。
答案 1 :(得分:1)
我最近在客户的大型机上调查了这个问题,工作解决方案首先添加了一个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.**'");