IFS へストリーム・ファイルを CPY
コマンドによってコピーしようとすると、コピー先のファイルが既に
存在しているとエラーとなってしまう。
しかし CPY
コマンドには CPYF
のように REPLACE = *YES
という置き換えのパラメータは
存在しないのである。
そこで IFSファイルの存在を検査して、既存であれば IFSファィルを削除してからコピーするように
すればよいのであるが、IFS のファイルの存在を検査するコマンドも OS400 には提供されて
いない。
そこでここでは CHKIFS
という名前の IFSファイルの存在を検査する *PGM
を作成してみた。
最初に CHKIFS
を使用している場面のソースを紹介する。
: DCL VAR(&FULLPH) TYPE(*CHAR) LEN(128) DCL VAR(&BACKUP) TYPE(*CHAR) LEN(128) : ASNET.COM/CHKIFS DIR(&BACKUP) MONMSG MSGID(CPF9800) EXEC(GOTO CMDLBL(COPY)) RMVLNK OBJLNK(&BACKUP) COPY: CPY OBJ(&FULLPH) TOOBJ(&BACKUP) :
目的は &FULLPH
というパス名の IFSファイルを &BACKUP
という名前の IFS に
CPY
コマンドを使って複製することである。
そこで事前に CHKIFS
を使って &BACKUP
の存在を検査している。
&BACUP
がもし見つからなければ CPF9800
というエラー・メッセージが戻るので
MONMSG
によって判定しているのである。
CMD PROMPT('IFS 検査 ') PARM KWD(DIR) TYPE(*CHAR) LEN(256) CASE(*MIXED) + PROMPT(' 登録簿 (/)')
CRTCMD CMD(MYLIB/CHKIFS) PGM(MYLIB/CHKIFS) SRCFILE(MYSRCLIB/QCMDSRC) AUT(*ALL)
/********************************************************************** /* /* CHKIFS : Check IFS File if exists. /* /* Office Quattro Co.ltd 02.11.09 15:04:03 created /* this program will be called by cmd CHKIFS. /* /* create : CRTBNDC ASNET.COM/CHKIFS /* /********************************************************************** #pragma comment(COPYRIGHT, "as400-net.com EnterpriseServer (C) CopyRigh Office Quattro.Corp. 2002- All right reserved. Users Restricted Rights - Use, duplication or disclosure restricted by Office Quattro Corp. Licenced Materials-Property of Office Quattro.") #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <QMHSNDPM.h> #include <errno.h> #define TRUE 0 #define FALSE -1 typedef struct { int BYTESPRO; int BYTESAVL; char MSGID[7]; char RESRVD; char EXCPDATA[100]; } ERRSTRUCTURE; /* Define the error return structure */ ERRSTRUCTURE errcode;/* Error Code Structure for RCVMSG */ void SndMsg(char msg_id[7], char msg_fl_name[20], char msg_data[128], int msg_data_len, char msg_type[10], char msg_queue[20]); /********************************************************************/ /* */ /* main : parm 1. dir name[256] */ /* */ /********************************************************************/ void main(int argc, char *argv[]){ char dir[257]; struct stat info; char* ptr; int pos; int fildes; char msg_id[7] = "CPF9897"; char msgf[10] = "QCPFMSG "; char msglib[10] = "QSYS "; char msg_fl_name[20]; char msg_data[132]; int msg_data_len; char msg_type[10]; char msg_queue[20]; int len; memset(dir, 0, sizeof(dir)); memcpy(dir, argv[1], 256); dir[256] = 0x00; dir[50] = 0x00; system("CHGJOB CCSID(5035)"); ptr = strchr(dir, ' '); if(ptr != NULL){ pos = (int)(ptr - dir); dir[pos] = 0x00; } if((fildes = open(dir, O_RDONLY)) == FALSE){ system("CHGJOB CCSID(5026)"); system("CHGJOB CCSID(65535)"); memset(msg_data, 0, sizeof(msg_data)); sprintf(msg_data, "%s が見つからない ", dir); msg_data_len = strlen(msg_data); memset(msg_fl_name, 0, sizeof(msg_fl_name)); memcpy(msg_fl_name, msgf, 10); memcpy(&msg_fl_name[10], msglib, 10); memset(msg_type, 0, sizeof(msg_type)); strcpy(msg_type, "*ESCAPE "); memset(msg_queue, 0, sizeof(msg_queue)); strcpy(msg_queue, "*PGMQ "); SndMsg(msg_id, msg_fl_name, msg_data, msg_data_len, msg_type, msg_queue); return; } else{ close(fildes); } system("CHGJOB CCSID(5026)"); system("CHGJOB CCSID(65535)"); exit(0); return; } /********************************************************************/ void SndMsg(char msg_id[7], char msg_fl_name[20], char msg_data[128], int msg_data_len, char msg_type[10], char msg_queue[20]) /********************************************************************/ { int pgm_stk_cnt; char pgm_que[10]; char msg_key[4]; strncpy(msg_type, "*ESCAPE ", 10); pgm_stk_cnt = 1; strncpy(pgm_que, "*PGMBDY ", 10); errcode.BYTESPRO = errcode.BYTESAVL = 0; QMHSNDPM(msg_id, msg_fl_name, msg_data, msg_data_len, msg_type, pgm_que, pgm_stk_cnt, msg_key, &errcode); }
CRTBNDC PGM(MYLIB/CHKIFS) SRCFILE(MYSRCLIB/QCSRC) AUT(*ALL)
原理としては非常に簡単であり <fcntl.h>
による fopen
関数によってIFS ファイルのオープン
を試みてエラーとなれば、QMHSNDPM
によって CPF9897
の *ESCAPE
メッセージを戻す
だけである。
同じことを RPG でも作成することができるが C/400 のほうが自然な形で検査することができる。
EnterpriseServer Ver4.0 では GoSanta! という名前の HTML編集ツールが搭載された。
GoSanta! を使うと IFS 上の HTMLファイルをブラウザ上で編集することができるのであるが、
このとき編集対象の HTML は編集都度、直前の状態が BACKUP として保存される。
編集結果を元に戻したいときはオプションによって、直前の状態に戻すことができる機能が
備わっている。
この UnDo
のために内部では自動的に BACKUP が保存されているのであるが、Backup の
ために上記のように CHKIFS
による存在検査が使用されているのである。