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

时间:2013-04-17 15:58:57

标签: 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)时,我看到垃圾 - 符号,随机颜色等等。

我熟悉通过QtqIconvOpen API将数据从一个CCSID转换到另一个CCSID,所以如果我知道某个文件的CCSID与我们的默认CCSID不同,我可以将其转换。我在几年前编写代码来做到这一点并且工作正常。

我的问题是以编程方式查找IFS文件的CCSID。在Google搜索之后,我发现的唯一相关信息来自JamesA(How to determine the CCSID used in CPYFRMIMPF command?)的Stackoverflow,他指出您可以在QSHELL中执行“ls -S”以获取显示其CCSID和文件名的文件列表。

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

有谁知道这样的API或者比从ls -S filename解析列表更优雅的黑客?

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

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

3 个答案:

答案 0 :(得分:5)

Qp0lGetAttr() "Get Attributes" API似乎可以指定要为特定文件检索的一组属性,包括一个名为QP0L_ATTR_CCSID的文件。

Here's an example of this API in use from RPG.包含GetAttr电话的示例位于ZIP file linked from that page

答案 1 :(得分:4)

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

原型定义如下所示:

D stat            PR            10I 0 ExtProc('stat')                   
D   path                          *   Value Options(*string)            
D   buf                               Likeds(statDS)

然后你还需要统计数据结构:

 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

答案 2 :(得分:0)

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