Ti è mai capitato di dover generare un file zip per poi inviarlo via mail/ftp/… magari partendo da una cartella dell’IFS popolata di files?

Ecco un metodo per farlo utilizzando la shell del PASE innestata all’interno di un programma CLLE.

Lista files contenuti in una cartella

Innanzitutto conviene creare una cartella di lavoro all’interno della /tmp (presente di default su tutte le release) oppure all’interno della propria home (es. /home/myUsrPrf).

CRTDIR DIR('/home/PETRIS/zipTemp')

Per poter ottenere la lista dei files contenuti in una cartella IFS è possibile lanciare il comando ls

 CHGVAR     VAR(&QSHCMD) VALUE('cd myFolderIFS ; ls *.* > /home/PETRIS/zipTemp/listaFilesDaZippare.txt')
 QSH        CMD(&QSHCMD) 

Creazione e popolamento file zip

Ottenuta la lista dei files per poter gestire un ciclo di lettura copiamo il testo in un file fisico

//Creazione file sorgente
CRTSRCPF FILE(QTEMP/SRC) RCDLEN(212) MBR(*FILE)

//Copia da file txt IFS a file sorgente
CPYFRMSTMF FROMSTMF('/home/PETRIS/zipTemp/listaFilesDaZippare.txt') TOMBR('/QSYS.LIB/QTEMP.LIB/SRC.FILE/SRC.MBR') MBROPT(*REPLACE) ENDLINFMT(*LF)

//Copia da file sorgente a file fisico (creato in precedenza)
CPYF FROMFILE(QTEMP/SRC) TOFILE(QTEMP/MYFLATFILE) MBROPT(*REPLACE) FMTOPT(*CVTSRC) ERRLVL(*NOMAX)

A questo punto procediamo a creare il file zip (solo la prima volta) e inserire ciascuno dei files presenti nella lista

             CHGVAR VAR(&NVOLTE) VALUE(1) 
 CICLO:      RCVF
             MONMSG MSGID(CPF0000) EXEC(GOTO CMDLBL(FINECICLO))
             IF         COND(&NVOLTE *EQ 1) THEN(DO)
          /* &MYFLATFLD = campo del file fisico MYFLATFILE   */
             CHGVAR     VAR(&QSHCMD) VALUE('cd myFolderIFS ; ajar -cM /home/PETRIS/myZipFile.zip ' *CAT &MYFLATFLD)
             QSH        CMD(&QSHCMD)
             CHGVAR     VAR(&NVOLTE) VALUE(0)
             ENDDO
             ELSE       CMD(DO)
             CHGVAR     VAR(&QSHCMD) VALUE('cd myFolderIFS ; ajar -aM /home/PETRIS/myZipFile.zip ' *CAT &MYFLATFLD)
             QSH        CMD(&QSHCMD)
             ENDDO
             GOTO       CMDLBL(CICLO)
 FINECICLO:

Ogni volta che il sistema operativo inserisce un file all’interno dello zip esso sparisce dall’IFS (in pratica il file viene mosso dalla cartella all’archivio)

A questo punto non rimane che cancellare i files e la cartella temporanea

DLTF FILE(QTEMP/SRC) 

DLTF FILE(QTEMP/MYFLATFILE)
DEL OBJLNK('/home/PETRIS/zipTemp/listaFilesDaZippare.txt')

RMVDIR DIR('/home/PETRIS/zipTemp')

Unzip

Per effettuare l’operazione contraria è sufficiente utilizzare lo stesso comando con differente parametro

cd /home/PETRIS/zipTemp ; ajar -x /home/PETRIS/myZipFile.zip

a questo punto il sistema avrà estratto il contenuto di myZipFile.zip nella cartella zipTemp

About author

Head of Application development & Systems integration da sempre lavoro su "i". Programmatore, analista, project manager, sistemista, ... tanti cappelli ma un'unica piattaforma preferita. Collaboro con la community FAQ400 perchè credo fermamente nel lavoro di squadra e auspico una crescita continua e costante dell'ecosistema di cui mi sento parte.

Rispondi

%d blogger hanno fatto clic su Mi Piace per questo: