使用 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 错误:打开FTP服务器上的文件夹时发生错误。请检查是否有权限访问该文件夹

ftp上传错误,提示:打开FTP服务器上的文件夹时发生错误,请检查是不是有权限访问该文件夹。

如何检查FTP服务器目录中的更改?

c# 4 : 检查 FTP 目录是不是存在

从 FTP 服务器检查和下载多个文件