带有大型机的ftpClient.listFiles(“path”)

时间:2013-06-27 20:48:47

标签: java ftp mainframe

我试图从大型机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中的目录。

2 个答案:

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