RPG

211. 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
  として圧縮するサンプル 】
001.00 H DATEDIT(*YMD/)                                                               
002.00 F********** TESTQSH : ZIP 圧縮のテスト ********************************        
003.00 F*                                                                             
004.00 F**********************************************************************        
005.00 D*( QP2SHELL  のプロトタイプ宣言 )                                             
006.00 D QP2SHELL        PR                  EXTPGM('QP2SHELL')                       
007.00 D  CMD                       32767A   CONST OPTIONS(*VARSIZE)                  
008.00 D  OPT                       32767A   CONST OPTIONS(*VARSIZE:*NOPASS)          
009.00 D  PARM1                     32767A   CONST OPTIONS(*VARSIZE:*NOPASS)          
010.00 D  PARM2                     32767A   CONST OPTIONS(*VARSIZE:*NOPASS)          
011.00                                                                                
012.00  /FREE                                                                         
013.00     QP2SHELL('/QOpnSys/bin/jar' + X'00': 'cvf' + X'00':                        
014.00              '/TEST/ITS.zip' + X'00': '/ITS' + X'00');                         
015.00     *INLR = *ON;                                                               
016.00  /END-FREE                                                                     
【 解説 】

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 の環境において実行すること。