我在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是一个糟糕的选择,但我无能为力。
答案 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的实用程序做得很好;不确定你可能需要的是什么。