代码之家  ›  专栏  ›  技术社区  ›  Morag Hughson

使用DD名称时重命名文件

  •  0
  • Morag Hughson  · 技术社区  · 5 年前

    用“C”语言 LP64 使用以下符号打开PDS(E)成员时,将在Batch、TSO和z/OS UNIX中运行的编译程序(建议使用,以便使用文件处置):-

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

    我惊讶地发现以下方法似乎不起作用:-

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

    失败就像失败一样 errno 属于 ENOENT (EDC5129I没有这样的文件或目录。)

    文件 rename 他说:-

    rename()函数用于重命名内存文件和DASD数据集。它还重命名PDS(和PDSE)的单个成员

    如果我这样做:-

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

    这个 rename() 作品。

    或者,如果我这样做:-

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

    如果失败了 错误号 属于 EINVAL (EDC5121I参数无效。)

    为什么它不接受与用于 fopen ?

    这之所以重要,是因为 重命名() 当某人正在浏览PDSE时,无法成功。然而,使用DD:符号可以 fopen() 当浏览PDSE时,写入成功,因为JCL中DD名称上编码的DISP=SHR被采用 fopen() .

    所以,我想真正的问题是——当PDSE也被某人浏览时,我的程序如何以一种成功的方式重命名PDSE成员?

    0 回复  |  直到 5 年前
        1
  •  1
  •   Valerie R    5 年前

    重命名数据集所需的技术不同于重命名PDS/PDSE中成员的技术。。。我敢打赌,你调用的系统rename()函数只是弄错了。在z/OS中,有很多组合函数,如“rename()”,必须处理,并且发现一些不按预期工作的情况并不罕见。

    当然,值得致电IBM支持部门,看看这里是否还有其他事情发生。。。你试图做的事情似乎应该奏效,所以我认为把它当作bug或文档错误是有道理的。

    除此之外,正如您所建议的,您可以使用有效的重命名形式,也可以用实际正常工作的东西替换系统的重命名功能。

    一种简单的方法是在显示时创建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地址,或者您可以为您分配的DDNAME打开第二个DCB。

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

      STOW dcb,区域_from_step1,C

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

    说实话,我上面描述的正是系统运行时应该做的事情,但如果不是这样,而且IBM不想修复它,那么你可能更喜欢“手工”做这种事情。

        2
  •  -1
  •   Scott Fagen    5 年前

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

    以下是指向IBM IEHPROGM示例的链接(请注意任何中断): https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.idau100/u1354.htm

    --斯科特