Ibm midrange 如何以编程方式确定IFS中文件的CCSID?

Ibm midrange 如何以编程方式确定IFS中文件的CCSID?,ibm-midrange,rpgle,ibm-ifs,Ibm Midrange,Rpgle,Ibm Ifs,我在IFS中有许多文件,其中包含各种各样的CCSID(0、37、819、1200、1252等),我的任务是编写一个简单的RPGLE[1]程序,允许用户查看这些文件的内容 我们的系统(V6R1)CCSID(DSPSYSVAL QCCSID)是65535[2],我们的作业的默认CCSID是37,这意味着当我尝试显示CCSID 819(ASCII)时,例如,我看到垃圾符号、随机颜色等 我熟悉通过API将数据从一个CCSID转换为另一个CCSID,因此如果我知道某个文件的CCSID与默认CCSID不同,

我在IFS中有许多文件,其中包含各种各样的CCSID(0、37、819、1200、1252等),我的任务是编写一个简单的RPGLE[1]程序,允许用户查看这些文件的内容

我们的系统(V6R1)CCSID(DSPSYSVAL QCCSID)是65535[2],我们的作业的默认CCSID是37,这意味着当我尝试显示CCSID 819(ASCII)时,例如,我看到垃圾符号、随机颜色等

我熟悉通过API将数据从一个CCSID转换为另一个CCSID,因此如果我知道某个文件的CCSID与默认CCSID不同,我可以将其转换。我在几年前就写了代码来实现这一点,而且效果很好

我的问题是以编程方式查找IFS文件的CCSID。在谷歌搜索完之后,我在这里找到的唯一相关信息是JamesA()的Stackoverflow,他指出,您可以在QSHELL中执行“ls-S”,以获得显示其CCSID和文件名的文件列表

因此,理论上我可以执行
ls-S filename
,解析输出以获得CCSID,然后在必要时使用该CCSID执行数据转换。这是一个丑陋的黑客,如果可能的话,我更喜欢使用IBMAPI

有人知道这样一个API或比解析ls-S文件名中的列表更优雅的黑客吗

[1] 我使用C API的
open()
read()
close()
来实际读取数据


[2] 我知道65535是个糟糕的选择,但我对此无能为力。

有没有理由不使用DSPF?IBM的实用程序做得很好;不确定您可能需要什么元素。

它似乎允许您为特定文件指定一组要检索的属性,包括名为
QP0L\u ATTR\u CCSID的属性

包含GetAttr调用的示例位于中。

您可以使用集成文件系统API中的函数

原型定义如下所示:

D stat            PR            10I 0 ExtProc('stat')                   
D   path                          *   Value Options(*string)            
D   buf                               Likeds(statDS)
然后还需要stat数据结构:

 D statDS          DS                  Qualified Template
 D  st_mode                      10U 0
 D  st_ino                       10U 0
 D  st_nlink                      5U 0
 D  st_reserved2                  5U 0
 D  st_uid                       10U 0
 D  st_gid                       10U 0
 D  st_size                      10I 0
 D  st_atime                     10I 0
 D  st_mtime                     10I 0
 D  st_ctime                     10I 0
 D  st_dev                       10U 0
 D  st_blksize                   10U 0
 D  st_allocsize                 10U 0
 D  st_objtype                   11A
 D  st_reserved3                  1A
 D  st_codepage                   5U 0
 D  st_ccsid                      5U 0
 D  st_rdev                      10U 0
 D  st_nlink32                   10U 0
 D  st_rdev64                    20U 0
 D  st_dev64                     20U 0
 D  st_reserved1                 36A
 D  st_ino_gen_id                10U 0
使用它很容易

 D fileStats       DS                  Likeds(statDS)

  /free
     if stat('/path/to/file': fileStats) < 0;
        // error handling
     endif;

     // ccsid now in fileStats.st_ccsid
  /end-free
D类文件状态(statDS)
/免费的
如果stat('/path/to/file':fileStats)<0;
//错误处理
endif;
//ccsid现在位于fileStats.stu ccsid中
/结束自由

他问如何“以编程方式”完成这项工作。使用DSPF对程序不太友好。对不起。我以为有人会知道如何使用QCMDEXC。也许不是。通常,当有人说“以编程方式”时,他们的意思是他们想利用程序中的信息做一些事情。DSPF不会允许的。首先,我问这是否合适。。。我没说是。其次,我是按照原始规范(这是我最后一次对此的回复;这一切都没有意义。)“我的任务是编写一个简单的RPGLE[1]程序,允许用户查看这些文件的内容。”QCMDEXC只是运行一个命令。。。它不会返回任何信息。除非您只想显示文件的内容,否则这不是很有用。另外,DSPF只是交互式的,所以如果作业是批量运行的,它不会有多大帮助。