2

我在 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 不同,我可以转换它。我几年前编写了代码来做到这一点,它工作得很好。

我的问题是以编程方式找出 IFS 文件的 CCSID。谷歌搜索后,我发现的唯一相关信息是来自 JamesA 的 Stackoverflow(如何确定 CPYFRMIMPF 命令中使用的 CCSID?),他指出您可以在 QSHELL 中执行“ls -S”以获取显示其 CCSID 的文件列表和文件名。

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

有谁知道这样的 API 或更优雅的 hack,而不是从 解析列表ls -S filename

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

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

4

3 回答 3

5

看起来Qp0lGetAttr()“获取属性”API将允许您指定一组属性以检索特定文件,包括一个名为QP0L_ATTR_CCSID.

这是 RPG 中使用此 API 的示例。 包含 GetAttr 调用的示例位于从该页面链接的 ZIP 文件中

于 2013-04-17T16:18:27.137 回答
4

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

原型定义如下所示:

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
于 2013-04-26T13:09:10.093 回答
0

有理由不为此使用DSPF吗?IBM 的实用程序做得很好;不知道你可能需要什么 eles。

于 2013-04-17T16:12:44.357 回答