1

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

4

2 回答 2

2

z/OS有两个可用的文件系统。一个是“经典”文件系统(我的术语,我不知道 IBM 是如何区分的),其根源可以追溯到半个世纪前OS/360,另一个是较新的并且与Unix兼容。

您正在使用“经典”文件系统。没有目录。有时 FTP 客户端中存在语法糖,使数据集名称限定符(点之间的“AAAA”和“BBBB”部分)看起来像目录。他们不是。

我建议您在listFiles方法的参数中使用通配符。看看“AAAA.BBBB.CCCC.DDDD.**”是否能满足您的期望。

您可以尝试的其他方法是将参数“AAAA.BBBB.CCCC”传递给您的changeWorkingDirectory方法。

根据您使用的库的实现,上述任何一个都可能与 ISPF DSLIST命令等效。

于 2013-06-29T23:10:32.177 回答
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.**'");
于 2013-12-30T03:41:54.567 回答