2013-04-17 6 views
2

다양한 CCSID (0, 37, 819, 1200, 1252 등)가있는 IFS에 많은 파일이 있으며 간단한 RPGLE [1] 프로그램을 작성하여 사용자가 이러한 파일의 내용을보십시오.IFS에서 파일의 CCSID를 프로그래밍 방식으로 어떻게 결정합니까?

시스템 (V6R1) CCSID (DSPSYSVAL QCCSID)는 65535 [2]이고 작업에는 37의 기본 CCSID가 있습니다. 예를 들어 CCSID 819 (ASCII)를 표시하려고하면 쓰레기 - 기호 색상 등이 포함되어 있습니다.

QtqIconvOpen API를 통해 하나의 CCSID에서 다른 CCSID로 데이터를 변환하는 것에 익숙합니다. 따라서 파일에 기본 CCSID와 다른 CCSID가 있으면이를 변환 할 수 있습니다. 몇 년 전에 코드를 작성 했으므로 제대로 작동합니다.

제 문제점은 프로그램 적으로 IFS 파일의 CCSID를 알아내는 것입니다. 내가 찾은 유일한 관련 정보를 Jamesover (How to determine the CCSID used in CPYFRMIMPF command?)의 Stackoverflow에서 "ls -S"를 QSHELL에서 실행하여 CCSID와 파일 이름을 보여주는 파일 목록을 얻을 수 있다고 지적한 유일한 관련 정보가 있습니다.

따라서 이론적으로 나는 ls -S filename을 실행할 수 있으며 출력을 구문 분석하여 CCSID를 얻은 다음 필요한 경우 해당 CCSID를 사용하여 데이터 변환을 수행 할 수 있습니다. 그건 못생긴 해킹이야. 가능한 한 IBM API를 사용하는 편이 낫다.

누군가가 ls -S filename의 목록을 분석하는 것보다 더 좋은 해킹이나 API를 알고 있습니까?

[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