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

Posted

技术标签:

【中文标题】如何检查文件路径是不是存在【英文标题】:how to check if the file path exisit or not如何检查文件路径是否存在 【发布时间】:2019-01-21 16:36:57 【问题描述】:

我是大会的新手;如何从 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的长度

【问题讨论】:

那么你的问题是如何编码或调用strlen呢? 是的,除此之外,我将使用 , clc RETVAL(1),=cl1'0' ? 检查路径状态 【参考方案1】:

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

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

foo.c:

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

然后将该代码编译为:

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

然后看看编译器是如何生成代码的。 你也可以试试 -O2 看看优化器是怎么做的。 注意不要让优化器“做太多”,例如不要让它看到实际的字符串,否则它只会在编译时计算长度

【讨论】:

【参考方案2】:

这里有几点我注意到你自一月份以来没有任何完整的答案......

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

您认为您想要 strlen() - 使用 zSeries“SEARCH STRING”(或 SRST)指令在汇编程序中很容易实现它 - 但您缺少一个关键要素...C风格字符串之所以有效,是因为它们以空值结尾,并且在您的代码中,您拥有:

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

不一定有一个空终止符,所以 strlen 不会给你你所期望的(取决于内存中这个常量后面的内容)。您已经分配了一个 19 个字符的字符串,它后面的任何内容都是代码中下一步的函数。

更好的方法可能是使用更多的长缓冲区对其进行编码,如下所示:

BUFFERA  DC 1024C' '

然后您将被设置为处理一个序列,例如将字符串移动到该区域并使用 SRST 之类的东西计算它的长度。

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

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

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

【讨论】:

以上是关于如何检查文件路径是不是存在的主要内容,如果未能解决你的问题,请参考以下文章

如何检查文件(由完整路径给出)是不是存在?节点js [重复]

在c#中检查路径中是不是存在文件夹?

检查appdata中是不是存在文件而不在python代码中添加完整路径

使用 JavaScript 检查 iOS 路径中是不是存在文件

使用bash将文件从已删除文件夹移动到其原始路径应检查原始路径中是不是存在同名文件[重复]

Shell 脚本检查 dir 目录是不是存在然后更改路径,如果不存在则使用该名称创建 dir 并检查文件名不存在