Last Updated on 30 Settembre 2019 by Roberto De Pedrini

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

Related Posts
DB2 for i SQL – Stringhe – POSSTR-LOCATE-LOCATE_IN_STRING (IT)

Introduzione Spesso, nelle nostre applicazioni, abbiamo la necessità di lavorare con le stringhe di testo e l'SQL del DB2 può Read more

DB2 for i & SQL – FAQ & Howto (Part. 1) (IT)

Database DB2 e SQL ... forse lo strumento più potente e completo che abbiamo sulla piattaforma IBM i: ecco una Read more

Annuncio IBM i 7.4

Arriva direttamente con l'uovo di Pasqua questo annuncio IBM per le novità della versione IBM i 7.4, versione iNext secondo Read more

Generated Always Columns – Approfondimenti (IT)

Introduzione "Generated Always Column": sono colonne, campi, di una tabella il cui contenuto è controllato direttamente dal sistema ... e Read more

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.

3 Comments

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *