CL

81. API : QP2SHELL を使って zip 圧縮を行なう

ここでは PASE 環境(UNIX との互換の環境) のSHELLコマンドの実行の方法と
IBM System i 上での zip圧縮の方法を API: QP2SHELL を使って実現する方法を
一気に紹介しよう。

STRQSH コマンドで対話式で PASE 環境を起動して、SHELLコマンドを実行する方法は
よく知られているがバッチで プログラムから SHELLコマンドを簡単に起動する方法は
ほとんど紹介されていない。
何やら IBM が公開しているAPI: QP2SHELL を使えばできそうではあるが
実際にやってみるとかなり骨が折れて容易には QP2SHELL API は動作してくれない。

さらに同時に zip 圧縮の方法もここで紹介する。
System i で zip圧縮を実現するには OS Ver7.1 で ZIP のための API として

QzipZip, QzipUnzip

が提供されているが、PTF を適用しなければならない。
これも面倒な話で、一般的な方法とは言えない。

IBM System i で zip圧縮を実現するには、次の3つの方法がある。

1. GNU Zip を導入する。

GNU サイトから System i 用の GNU Zip をダウンロードして導入する。
GNU サイトとは無償で公開されているフリー・ソフトのサイトである。

2. zlib を導入する

PHP 用に公開されている zlib をダウンロードして導入する。

3. SHELL : jar コマンドを実行する

SHELL コマンド: jar を実行して、 zip を作成する。
jar コマンドは一般的には jarファイルを生成するためのものであるが
jar ファイルとは zip ファイルそのものであるので
zip ファイルを作成するのに jar コマンドを利用することができる。

- 1.と 2. の場合はWebサイトよりダウンロードして導入する、というものでこれらは
やはり面倒な手続きを必要とするし、何より業務として使用するには OS のリリース・アップや
System i の入れ替え時にも再導入の必要が出てくるのは、心配の種が増えようというものである。
3. の jar コマンドを利用する方法は、

  • ・ PASE 環境が導入されていること

  • ・ Java が導入されていること

が、必要条件とはなるが今では OS V5R1M0 以降であればほとんどの System iでは PASE 環境も
Java も導入されているはずであるので問題はない、と予想できる。
3. の SHELL コマンドを使う方法であれば、System i に導入の必要が一切、ない。
問題はどのように SHELL コマンドを使うか、そして zip圧縮を実現するか、である。
それをこの章で紹介していく。

【 TESTQSH: /ITSフォルダー以下のIFSファイルをすべて /TEST/ITS.zip
  として圧縮するサンプル 】
0001.00              PGM                                                                 
0002.00 /*---------------------------------------------------------*/                    
0003.00 /*   TESTQSH  : ZIP 圧縮のテスト                           */                    
0004.00 /*---------------------------------------------------------*/                    
0005.00              DCL        VAR(&MSG) TYPE(*CHAR) LEN(80)                            
0006.00              DCL        VAR(&MSGID) TYPE(*CHAR) LEN(7)                           
0007.00              MONMSG     MSGID(CPF0000) EXEC(GOTO CMDLBL(ERROR))                  
0008.00                                                                                  
0009.00              CALL       PGM(QP2SHELL) PARM('/QOpenSys/bin/jar' 'cvf' +           
0010.00                           '/TEST/ITS.zip' '/ITS')                                
0011.00              RETURN                                                              
0012.00                                                                                  
0013.00  ERROR:      RCVMSG     MSGTYPE(*LAST) RMV(*NO) MSG(&MSG) MSGID(&MSGID)          
0014.00              SNDPGMMSG  MSG(&MSGID *CAT '=' *CAT &MSG) +                         
0015.00                           TOMSGQ(*TOPGMQ) MSGTYPE(*DIAG)                         
0016.00              ENDPGM                                                               
【 解説 】

STRQSH による PASE 環境において /ITS 以下をまとめて /TEST/ITS.zip として zip圧縮するのであれば

jar cvf /TEST/ITZ.zip /ITS

のように実行すればよい。
jar コマンドに続く cvf は圧縮することを指示している。解凍であれば xvf を指示する。
つまり圧縮であれば、

jar cvf (圧縮先のファイル名) (圧縮する元のフォルダー名)

の形式である。

( jar コマンドの使用方法については、 http://msugai.fc2web.com/java/jar.html を参照のこと )

API: QP2SHELL の使用方法は

QP2SHELL("SHELLコマンド", "第1パラメータ", "第2パラメータ", .... )

という具合である。このことは API: QP2SHELL のIBM の解説にはわかりやすい解説もないし、
例もないので 実際の実行に手間取ってしまうのである。

このように答えとしての方法を知ってしまえば zip圧縮は非常に簡単に実行することができる。
PTF や Webサイトからツールを導入するよりは、はるかに簡単に実現することができる。

【補足】 上記のプログラムは CCSID 5035 の環境において実行すること。