Ben*_*ill 2 rpgle ibm-midrange 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.在谷歌搜索之后,我发现的唯一相关信息来自JamesA的Stackoverflow(如何确定CPYFRMIMPF命令中使用的CCSID?)谁指出你可以在QSHELL中执行"ls -S"以获得显示其CCSID的文件列表和文件名.
因此理论上我可以执行ls -S filename,解析输出以获取CCSID,然后在必要时使用该CCSID执行数据转换.这是一个丑陋的黑客,如果可能的话我更喜欢使用IBM API.
有谁知道这样的API或更优雅的黑客比解析列表ls -S filename?
[1]我使用C API open(),read()并close()实际读取数据.
[2]我知道65535是一个糟糕的选择,但我无能为力.
看起来Qp0lGetAttr()"Get Attributes"API将允许您指定要为特定文件检索的一组属性,包括一个名为的文件QP0L_ATTR_CCSID.
以下是RPG使用此API的示例. 包含GetAttr调用的示例位于从该页面链接的ZIP文件中.
您可以使用集成文件系统API中的stat()函数。
原型定义如下所示:
D stat PR 10I 0 ExtProc('stat')
D path * Value Options(*string)
D buf Likeds(statDS)
Run Code Online (Sandbox Code Playgroud)
然后,您还需要统计数据结构:
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
Run Code Online (Sandbox Code Playgroud)
使用它很容易
D fileStats DS Likeds(statDS)
/free
if stat('/path/to/file': fileStats) < 0;
// error handling
endif;
// ccsid now in fileStats.st_ccsid
/end-free
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2010 次 |
| 最近记录: |