使用 DD 名称时重命名文件

rename file when using DD name

在'C'语言LP64编译的程序中,当使用以下符号(推荐以允许使用文件处置):-

hFile = fopen("DD:CONFIG(COPY)", "w");
fclose(hFile);

我很惊讶地发现以下内容似乎不起作用:-

rename("DD:CONFIG(COPY)","DD:CONFIG(MAIN)");

ENOENTerrno 一样失败(EDC5129I 没有这样的文件或目录。)

rename 的文档说:-

The rename() function renames memory files and DASD data sets. It also renames individual members of PDSs (and PDSEs)

如果我这样做:-

rename("//'MYUSER.CONFIG(COPY)'","//'MYUSER.CONFIG(MAIN)'");

rename() 有效。

或者如果我这样做:-

rename("//'MYUSER.CONFIG(COPY)'","DD:CONFIG(MAIN)");

如果失败,errnoEINVAL(EDC5121I 参数无效。)

为什么它不接受用于 fopen 的相同文件名符号?

之所以重要,是因为 rename() 在有人浏览 PDSE 时无法成功。然而,使用 DD: 表示法允许 fopen() 在浏览 PDSE 时成功写入,因为在 JCL 中的 DD 名称上编码的 DISP=SHR 被 fopen().[=26 采用=]

所以,我想真正的问题是 - 我的程序如何重命名 PDSE 成员,以便在 PDSE 也被某人浏览时成功?

不确定这是否可行,但由于您已经分配了数据集,也许您可​​以从您的程序“调用”(对于调用的某些值)IEHPROGM,在调用之前构建正确的 SYSIN?

这是一个 link 的 IBM IEHPROGM 示例(注意任何中断): https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.idau100/u1354.htm

--斯科特

重命名数据集所需的技术不同于重命名 PDS/PDSE 中的成员的技术...我敢打赌,您正在调用的系统 rename() 函数只是得到这个错误的。在 z/OS 中,有很多像“rename()”这样的组合函数必须处理,而且经常会发现一些不能按预期工作的函数。

当然值得打电话给 IBM 支持,看看这里是否还有其他问题...您正在尝试做的事情似乎应该有效,所以我认为有一些话要说错误或文档错误。

除此之外,正如您所建议的,您可以使用有效的重命名形式,或者您可以将系统的重命名功能替换为实际有效的功能。

一种简单的方法是创建您展示的 rename():

rename("//'MYUSER.CONFIG(COPY)'","//'MYUSER.CONFIG(MAIN)'");

您可以使用 fldata() 函数获取 DDNAME 的 DSN,因此在给定打开文件句柄的情况下即时创建这样的重命名并不难。请注意,重命名的形式可能会分配您使用 DISP=OLD 指定的文件,因此如果其他任务分配了该文件,则会导致问题。此外,如果这应该是商业质量代码,作为客户,如果我发现你需要启动一些外部程序,因为你不知道如何重命名 PDS/PDSE 成员,我的眉毛会扬起 -但那可能只是我。

另一种选择是编写您自己的“rename()”函数...不幸的是,如果您希望它高效,它很可能需要是汇编语言。正如其他人所建议的那样,您可能会产生 shell、REXX 或 TSO 命令,但当然,这意味着创建一个新进程等等,只是为了重命名 PDS/PDSE 成员。另请记住,其中一些方法在尝试使用 DISP=OLD 分配输入文件时也可能存在问题。

如果这对您的需要来说太慢了,执行您想要的操作的方法是调用一个小型汇编器例程,该例程针对您的 DDNAME 调用系统 STOW 服务来进行重命名。流程将是这样的:

  1. 您将创建一个包含新旧成员名称的 16 字节区域。它们各有 8 个字符,并用空格填充。

  2. 您需要描述您正在查看的文件的打开的 DCB 的地址。您可以从 FILE 结构中获取 DCB 地址,我相信 - 或者您可以打开第二个 DCB 到您分配的 DDNAME。

  3. 您将使用参数调用系统 STOW 服务,告诉它重命名 PDS/PDSE 成员:

    STOW dcb,area_from_step1,C

在上面的 STOW 宏中,“C”的“目录选项”告诉 STOW 您想要重命名现有成员。 area_from_step1 包含当前成员名称和新成员名称 - 系统在目录中搜索当前名称并用新成员名称重写。

老实说,我上面描述的正是系统运行时应该做的,但如果不是并且 IBM 不想修复它,那么您可能更愿意“手动”做这种事情".