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.
Index
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
Buon pomeriggio, avrei un problema di questo genere: cercando di zippare 2 file contenuti in /home/dir1/dir2/ZipTemp, lo zip viene creato (Miozip.zip) mantenendo tutto il path; non riesco a trovare il modo di zippare solo i file senza portarmi dietro tutta l’alberatura; uso questo comando:
QSH CMD(‘cd /home/dir1/dir2 ; jar -cfM Miozip.zip /home/dir1/dir2/ZipTemp/*’)
Aprendo lo zip, prima dei file contenuti nella cartella ZipTemp, mi trovo le cartelle /hom/dir1/dir2.
Che parametro sbaglio?
grazie mille
Ciao Gabriele, scusami, leggo solo ora il tuo commento ..
La versione di Jar su IBM i non ha le opzione -j e -jr per fare questa cosa… ma noi siamo più furbi … zippando la cartella corrente dentro un zip in un’altra posizione …
QSH CMD(‘cd /home/dir1/dir2/ZipTemp ; jar -cfM ../Miozip.zip *’)
HTH
Roberto
Ciao, grazie per il suggerimento abbastanza risolutivo ma non del tutto, se i file da zippare tutti nello stesso archivio provengono da directory differenti come si fa a cancellarne i percorsi nel file ZIP?
Grazie, Barbara