Zip/Unzip via QSH

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

View Comments

  • 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

Recent Posts

Code for IBM i 2.10.0 – Debug IBM i con Visual Studio Code

Le funzioni di debug con Visual Studio Code sono disponibili da qualche tempo ma questa nuova versione 2.10.0 semplifica la…

2 giorni ago

ObjectConnect over TCP/IP

A distanza di due anni e mezzo dal mio post Trasferire oggetti con ObjectConnect ed Enterprise Extender, sono finalmente riuscito…

3 giorni ago

SQL: SELECT con i “superpoteri”

Con un piccolo trucco anche una semplice istruzione SELECT può eseguire qualsiasi comando di sistema ! Vediamo come...

5 mesi ago

NetServer per tutti – parte 5

Una mini-guida a puntate per la configurazione, gestione, uso e risoluzione dei problemi di IBM i NetServer

1 anno ago

NetServer per tutti – parte 4

Una mini-guida a puntate per la configurazione, gestione, uso e risoluzione dei problemi di IBM i NetServer

1 anno ago

NetServer per tutti – parte 3

Una mini-guida a puntate per la configurazione, gestione, uso e risoluzione dei problemi di IBM i NetServer

1 anno ago