IFS

25. RPGでストリーム・ファイルの存在を簡単にチェックするには?

IFS のストリーム・ファイルが存在しているかどうかを検査するには
C言語の関数 : lstat を使うのが最も簡単である。
lstat はストリーム・ファイルの属性を取得する関数 (API) であり
ストリーム・ファイルが存在していなければエラー (-1) を戻す。
ここでは lstat によって IFS の存在を確認する簡単な RPGプログラムを
紹介しよう。

【 TESTIFS: IFSストリーム・ファイルの存在を検査するRPGプログラム 】

0001.00 H DFTNAME(TESTIFS) DATEDIT(*YMD/) BNDDIR('QC2LE')                        
0002.00 F**********  ストリーム・ファイルの存在チェック ***********************  
0003.00 F*                                                                       
0004.00 F**********************************************************************  
0005.00 D LSTAT           PR             4B 0 EXTPROC('lstat')                   
0006.00 D   FILE                          *   VALUE OPTIONS(*STRING)             
0007.00 D   INFO                          *   VALUE OPTIONS(*STRING)             
0008.00                                                                          
0009.00 D*( ファイル属性 )                                                       
0010.00 D INFO_P          S               *   INZ(%ADDR(INFO))                   
0011.00 D INFO            DS           128                                       
0012.00 D  ALLOCSIZ              45     48B 0                                    
0013.00                                                                          
0014.00 D GIFFILE         C                   CONST('/QATMHSTOUT/ALASKA.GIF')    
0015.00 D RES             S              4B 0 INZ(0)                             
0016.00 D TRUE            S              4B 0 INZ(0)                             
0017.00 D FALSE           S              4B 0 INZ(-1)                            
0018.00                                                                          
0019.00  /FREE                                                                   
0020.00     RES = LSTAT(GIFFILE:INFO_P);                                         
0021.00  /END-FREE                                                               
0022.00 C                   IF        RES = TRUE                                 
0023.00 C     ' ありました 'DSPLY                   ANS               1          
0024.00 C                   ELSE                                            
0025.00 C     'NOT FOUND !' DSPLY                   ANS                     
0026.00 C                   ENDIF                                           
0027.00 C                   SETON                                        LR 
0028.00 C                   RETURN                                          

【 解説 】

lstat 関数をインクルードするためには BNDDIR ('QC2LE') を定義して
C関数のライブラリーをインクルードできるようにしておくこと。
BNDDIR ('QC2LE') によって C言語のライブラリーの中から lstat の入った
サービス・プログラムがインクルードされるようになる。

0005.00 D LSTAT           PR             4B 0 EXTPROC('lstat')                   
0006.00 D   FILE                          *   VALUE OPTIONS(*STRING)             
0007.00 D   INFO                          *   VALUE OPTIONS(*STRING) 

は lstat の定義を宣言している。
lstat は英小文字だが見やすくするために英大文字 LSTAT として再定義している。

0014.00 D GIFFILE         C                   CONST('/QATMHSTOUT/ALASKA.GIF')    
0015.00 D RES             S              4B 0 INZ(0)                             
0016.00 D TRUE            S              4B 0 INZ(0)                             
0017.00 D FALSE           S              4B 0 INZ(-1)

は IFS: /QATMHSTOUT/ALASKA.GIF の定義と
TRUE FALSE を定義している。
lstat の結果は C言語の Integer (整数) 値として戻るので 4B 0 として
RPG でも Integer (整数) として定義している。

0019.00  /FREE                                                                   
0020.00     RES = LSTAT(GIFFILE:INFO_P);                                         
0021.00  /END-FREE      				

で、フリー・フォーマットで GIFFILE の存在検査を行っている。
フリー・フォーマットですべてを記述することができるが、まだフリー・フォーマットに
不慣れな人も多いので固定フォーマットとの混在でわかりやすく記述した。

0022.00 C                   IF        RES = TRUE                                 
0023.00 C     ' ありました 'DSPLY                   ANS               1          
0024.00 C                   ELSE                                            
0025.00 C     'NOT FOUND !' DSPLY                   ANS                     
0026.00 C                   ENDIF

によって存在結果を表示している。