使用 java ftp 检查 mainfame 上是不是存在数据集
Posted
技术标签:
【中文标题】使用 java ftp 检查 mainfame 上是不是存在数据集【英文标题】:check if a dataset exists on mainfame using java ftp使用 java ftp 检查 mainfame 上是否存在数据集 【发布时间】:2019-02-05 19:15:41 【问题描述】:有人对大型机数据集使用过ftp.changeWorkingDirectory
命令吗?当有数据集时,此命令返回 true。当没有数据集时,它也会返回 true。如果您有任何用于处理大型机数据集的示例 java ftp 代码,您能否分享一下。这是我的代码不起作用。
public static FTPFile[] GetListOfMembersFromPDS(String pdsname, String serverN)
FTPSClient ftp = FTPConnect(serverN);
FTPFile[] files = null;
boolean success = false;
try
success = ftp.changeWorkingDirectory(pdsname);
if (!success)
throw new IOException("Unable to change working directory to " + pdsname
+ " for ftp transfer with ftp client = " + ftp + ". " + ftp.getReplyString());
catch (IOException e)
e.printStackTrace();`enter code here`
System.out.println(success);
try
files = ftp.listFiles();
catch (IOException e)
e.printStackTrace();
return files;
【问题讨论】:
你使用什么 Java 框架来进行 FTP ......看起来不像 Apache Commons。 【参考方案1】:在 z/OS 数据集环境中更改工作目录通常会返回 true,除非您指定的限定符太长,或者整个名称太长。这并不表示工作目录存在与否,因为大型机数据集不适用于目录结构。
如果你切换到一个还不存在的“工作目录”,你会得到这样的响应:
250 "这就是工作总监。"是工作目录名称前缀。
如果您尝试使用无效的名称,您会得到错误的结果。
501 “THIS.IS.THE.WORKING.DIRECTORY”中的限定符超过 8 个字符
如果你尝试使用一个太长的名字,你会得到错误的。
501 无效的目录名称 - 太大。
因此,依赖 changeWorking Directory 中的布尔值是行不通的。您需要使用“getReplyString()”方法查看回复字符串,然后对其进行解析。
loadlib PDS 会说类似 250-工作目录可能是加载库 250 工作目录“GAME.LOADLIB”是一个分区数据集
非 loadlib PDS 只会说
250 工作目录“GAME.COBOL”是一个分区数据集。
listFiles、listDirectories 和 ListNames 也有不同的行为。
我有许多数据集,它们是 GAME.SRCE、GAME.COPYLIB、GAME.LOADLIB 和 GAME.LOADLIB.PDSE。它们都是分区数据集。如果您将目录更改为 GAME,然后执行 listNames(),您将获得全部 4 个。如果您列出文件或 listDirectories,您只会获得 COPYLIB 和 SRCE。如果您将目录更改为 GAME.SRCE,则所有三种方法都将列出所有成员。如果您将目录更改为 GAME.LOADLIB,则只有 listNames 会列出成员。您也不知道 GAME.LOADLIB.PDSE 存在。
这是使用 Apache Commons、commons-net-3.6.jar 和 z/OS 完成的。
【讨论】:
【参考方案2】:这是我通过搜索找到的一个简单示例。如果目录无法更改,您应该会看到 success=false:
// Change working directory
success = ftp.changeWorkingDirectory(pdsname);
String[] replies = ftp.getReplyStrings();
if (replies != null && replies.length > 0)
for (String aReply : replies)
System.out.println("SERVER: " + aReply);
if (success)
System.out.println("Successfully changed working directory.");
else
System.out.println("Failed to change working directory to " + pdsname + ". See server's reply.");
【讨论】:
不幸的是,无论数据集是否存在,成功总是返回 true。还有其他想法吗? 不确定。我不熟悉什么是“大型机数据集”。它们是否显示为文件夹?您只是想更改目录,但这是行不通的,对吗?更改目录时检查服务器回复的内容。查看是否有比您正在使用的更新版本的 FTP 库。 它们有名称但不在目录结构中。最接近“文件夹”的是“分区数据集”,它也以扩展 (PDSE) 形式出现。数据集名称的格式为 QUAL1.QUAL2.QUAL3。如果您指的是“PDS 成员”(就像文件夹中的文件),那么这是 QUAL1.QUAL2.QUALI3(MEMBER)。如果您将目录更改为 QUAL1,然后列出文件,您将从该目录开始获得所有内容。 QUAL1.QUAL2 可能不存在但可以创建。如果您列出 QUAL1.QUAL2.QUAL3 并且它是一个 PDS,您将获得所有成员,但不会获得其他数据集。如果您在 PDS 中,FTP 会告诉客户端。 大型机 FTP 也可以在两种模式下工作,您可以像我上面描述的那样以数据集模式启动,或者以更传统的 UNIX/Windows 类型的目录模式启动。 如果您将工作目录更改为 PDS,您将收到此回复字符串。 '250 工作目录“THIS.IS.A.PDS”是一个分区数据集'我遇到了防火墙问题,所以我稍后会做更多的事情。以上是关于使用 java ftp 检查 mainfame 上是不是存在数据集的主要内容,如果未能解决你的问题,请参考以下文章
FTP 错误:打开FTP服务器上的文件夹时发生错误。请检查是否有权限访问该文件夹