如何检查文件路径是否存在

问题描述 投票:-1回答:2

我是集会的新手;如何检查IBM大型机程序集代码中是否存在某个路径(UNIX)路径。例如,我想检查路径'/ user / lpd / file'路径是否存在。

IBM页面上有一个示例

     MVC   BUFFERA(19),=CL19'labrec/qual/current'                   
     MVC   BUFLENA,=F'19'                                           
     SPACE ,                                                        
     CALL  BPX1STA,              Get file status                   +
           (BUFLENA,             Input: Pathname length            +
           BUFFERA,              Input: Pathname                   +
           STATL,                Input: Length of buffer needed    +
           STAT,                 Buffer, BPXYSTAT                  +
           RETVAL,               Return value: 0 or -1             +
           RETCODE,              Return code                       +
           RSNCODE),             Reason code                       +
           VL,MF=(E,PLIST)       ---------------------------------- 

但是仍然需要手动查找参数a的长度

assembly mainframe
2个回答
0
投票

当我第一次开始学习HL / ASM时,我发现使用操作原理和C编译器列表的组合很方便。

如果你在Unix系统服务端,你可以写一段代码,例如

foo.c的:

#include <stdlib.h>
int foo(const char* str) {
  return strlen(str);
}

然后将该代码编译为:

c89 -c -Wc,list(./)foo.c

然后看看编译器如何生成代码。您也可以尝试-O2来查看优化器可能会如何执行此操作。注意不要让优化器“做太多”,例如不要让它看到实际的字符串,否则它只会在编译时计算长度


0
投票

这里有几点,因为我注意到你从1月份以来没有得到任何完整的答案......

首先,如果您的目标是计算文件名的长度,以便将其作为参数传递给stat()(或BPX1STA),那么您的代码示例中还有一些其他问题。

你认为你想要strlen() - 使用zSeries“SEARCH STRING”(或SRST)指令在汇编程序中很容易实现 - 但是你缺少一个关键的成分来实现这个... C风格的字符串可以工作,因为它们是空终止的,并且在您的代码中,您拥有:

MVC BUFFERA(19),=CL19'labrec/qual/current'

strlen不一定是null终止符,因此strlen不会给你你期望的东西(取决于你在内存中的这个常量)。你已经分配了一个19个字符的字符串,无论它是什么,它都是你代码中下一个字符串的函数。

更好的方法可能是用更多的长缓冲区来编码它,如下所示:

BUFFERA  DC 1024C' '

然后你将被设置为处理一个序列,比如将字符串移动到这个区域并用SRST计算它的长度。

IBM的例子没有这个问题,因为BPX1STA不需要以空字符结尾的字符串,所以他们已经跳过了动态计算长度的想法,只是显示了一个硬编码的值。如果你想让它更有动态,你可能会做一些事情,比如分配一个任意长的缓冲区(UNIX服务文件名可以是1024字节长),将缓冲区设置为空,复制你想要的文本 - 然后你可以通过SRST获得长度并进行一些减法。这并不难。

另一点是,很多时候,与相应的BPX1 ...汇编服务相比,调用C运行时函数更容易。在汇编程序中,挑战是让你的代码符合LE标准,但是一旦你这样做(而且很容易),你可以像C程序员一样简单地调用“stat()”。在这种情况下,您只需传递一个以null结尾的文件名和一个输出缓冲区地址,运行时函数将完成所有工作。

如果你能熟练使用C语言,编写符合LE标准的汇编程序的一种简单方法就是在C中编写一个简短的“main()”,让它调用你的汇编程序代码......这样,所有LE设置都完成了提前完成,现在可以在汇编程序中使用C运行时中可用的任何内容。另一种选择是在汇编程序代码中编写各种CEE ...宏 - 这也很简单。

© www.soinside.com 2019 - 2024. All rights reserved.