2013-04-17 69 views
2

我有很多CCSID(0,37,819,1200,1252等)的IFS文件,我的任務是編寫一個簡單的RPGLE [1]程序,它將允許用戶查看任何這些文件的內容。我們的系統(V6R1)CCSID(DSPSYSVAL QCCSID)是65535 [2],我們的作業有一個默認的CCSID爲37,這意味着當我嘗試顯示CCSID 819(ASCII)時,例如,我看到垃圾 - 符號,隨機顏色等如何以編程方式確定IFS中文件的CCSID?

我熟悉通過QtqIconvOpen API將數據從一個CCSID轉換到另一個,所以如果我知道一個文件的CCSID不同於我們的默認CCSID,我可以將其轉換。我多年前編寫代碼來做到這一點,它工作正常。

我的問題是編程找出IFS文件的CCSID。在Google搜索之後,我發現的唯一相關信息是來自JamesA的Stackoverflow(How to determine the CCSID used in CPYFRMIMPF command?),他指出您可以在QSHELL中執行「ls -S」以獲取顯示其CCSID和文件名的文件列表。

因此理論上我可以執行ls -S filename,解析輸出以獲取CCSID,然後使用該CCSID在必要時執行數據轉換。這是一個醜陋的黑客攻擊,如果可能的話,我更願意使用IBM API。

有沒有人知道這樣一個API或比解析ls -S filename上市更優雅的黑客? [1]我使用C API的open(),read()close()來做實際的數據讀取。

[2]我知道65535是一個糟糕的選擇,但我無能爲力。

回答

0

有沒有理由不使用DSPF? IBM的效用做得很好;不知道你可能需要什麼。

+0

他問怎麼辦它「以編程方式」。使用DSPF並不是那種程序友好的。 –

+0

對不起。我假設你會知道如何使用QCMDEXC。也許不是。 – Dennis

+2

通常,當有人說'以編程的方式'時,他們意味着他們想要對程序中的信息做些什麼。 DSPF不會允許這樣做。 –

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 
相關問題