Quando lo spazio non basta mai...


Indice

DOWNLOAD UNPACKER.ZIP (8.8 KB)

Introduzione

Nonostante i mezzi di memorizzazione di massa diventino sempre più capienti e meno costosi, lo spazio a nostra disposizione sembra che non sia mai sufficiente.
La soluzione comune a questo problema è già da diversi anni quella di ricorrere alla compressione dati. Questa non solo ci permette di sfruttare meglio lo spazio, ma ci permette anche di trasferire file da una macchina ad un'altra in un tempo minore.

Quasi quotidianamente abbiamo a che fare con file compressi di vario tipo di cui sono sempre liberamente disponibili i programmi per la decompressione. Tali programmi usano ognuno una diversa serie di opzioni, che anche i più abituati alla CLI (command line interface) possono non ricordare, specialmente quando si ha a che fare con un tipo di file compresso inconsueto.

Avendo a disposizione un'interfaccia così gradevole come la WPS sarebbe molto più comodo trattare i file compressi come cartelle aprendoli con un semplice click.
Nonostante ci siano già diversi programmi che implementano questo in modo più o meno consistente con la filosofia della Workplace Shell, vedremo in questo articolo, suddiviso in più puntate, come poter usare il linguaggio di scripting del sistema, il REXX, per creare un semplice programma per la decompressione dei file compressi (UNPACKER.CMD), che renderemo poi sempre più potente e completo.

La versione trattata in questo articolo ci permetterà di cliccare su un file compresso, vedere la sua icona assumere l'aspetto di una cartella aperta (se il file non è su un supporto a sola scrittura come un CD ROM), e vedere aprirsi una cartella con il contenuto del file espanso. Le operazioni fatte su questa cartella però non si rifletteranno sul file compresso stesso. Aggiungere o cancellare file dalla cartella non comporterà la modifica del file compresso corrispondente.
Un'altra limitazione è dovuta al fatto che la versione attuale usa delle funzioni contenute solo nella REXXUTIL.DLL di OBJECT.REXX per cancellare, alla chiusura delle cartelle con il contenuto del file espanso, le directory temporanee create. Chi ha installato sulla propria macchina solo il REXX classico, potrà solo ripulire periodicamente la directory in cui vengono create le varie subdirectory temporanee. E' possibile eseguire questa operazione automaticamente ad ogni boot del sistema tramite uno degli script compresi in unpacker.zip.
La routine usata per evitare di scompattare più volte lo stesso file, se questo è ancora aperto, rende inoltre impossibile la scompattazione contemporanea di file compressi che abbiano lo stesso nome.
Nei prossimi articoli eliminiremo le suddette limitazioni e cercheremo di implementare tramite una DLL esterna le funzioni presenti solo in OBJECT.REXX.

Funzionamento del programma

Grazie alla potenza dei processori attuali, la scompattazione di un file compresso, anche di diversi megabyte di dimensione, viene solitamente eseguita in pochi secondi. Del resto se vogliamo eseguire un programma contenuto in un archivio (userò in questo articolo "archivio" come sinonimo di file compresso), è probabile che esso faccia riferimento ad altri file come DLL o file INI. Allo stesso modo, se vogliamo visualizzare correttamente un documento html, dovremo scompattare non solo il file stesso, ma anche le immagini in esso visualizzate.
Considerando tutto ciò, e le limitazioni del rexx, è molto più semplice espandere direttamente tutto l'archivio in una directory temporanea che elencarne prima il contenuto.

Il programma richiede due parametri:

expandpath
Rappresenta il percorso in cui verranno create le directory temporanee.
filename
Rappresenta il file da scompattare e viene passato al programma automaticamente dalla WPS quando si esegue un doppio click su un file di archivio o quando si trascina sull'icona del programma un file di archivio.

Le operazioni svolte dallo script presentato in questo articolo sono in sintesi le seguenti:

  1. Inizializzazione
    1. Si controlla l'esistenza del file da espandere ricavandone il percorso completo.
    2. Si ricava il percorso in cui risiede lo script. In tale percorso ci saranno le icone di cartella-archivio aperta e chiusa.
    3. Carica le funzioni rexxutil se non sono già in memoria.
    4. Se presente, elimina lo slash finale dal percorso expandpath
  2. Riconoscimento del tipo di archivio. Questa versione del programma riconosce automaticamente archivi compressi con InfoZip-PKZip, ARJ, RAR, PACK e PACK2.
    Questi ultimi due, che sono i programmi mediante i quali vengono compressi i file di installazione del sistema operativo e di diversi driver, non usano un'estensione comune per cui, per aprirli, sarà necessario trascinarli sull'icona del programma Unpacker.
    Ciò sarà necessario anche per i file ZIP, ARJ e RAR privi dell'usuale estensione.
    Nei prossimi numeri vedremo come poter ovviare a questo inconveniente grazie agli attributi estesi.
    1. Come prima cosa viene isolata l'estensione del file e confrontata tramite l'istruzione select alle estensioni riconosciute (di default: ZIP, ARJ, RAR).
      Per permettere il riconoscimento di ulteriori estensioni sarà sufficiente aggiungere sotto la riga:
      when endFileName = ".RAR" then command = "@unrar x"
      
      una riga di simile sintassi. Cioè:
      when endFileName = "<extension>" then command = "<command>"
      
      dove:
      <extension>
      rappresenta l'estensione da far riconoscere (esempio .ZOO).
      <command>
      rappresenta il comando necessario per espandere l'archivio nella directory corrente ricreando l'albero completo delle subdirectory contenute nell'archivio stesso.
    2. Nel caso il file introdotto come argomento non esista, il programma termina dopo aver emesso un beep (pur essendo previsto un messaggio di errore consiglio di eseguire il programma minimizzato per non avere finestre inutili ad ingombrare lo schermo).
    3. Nel caso l'estensione non sia tra quelle riconosciute, il programma legge i primi caratteri del file per determinare se questo è un tipo di file compresso noto. Pur essendo possibile modificare lo script per accettare file di tipo diverso da quelli previsti, vi sconsigilio di farlo se non avete una certa dimestichezza con il REXX a meno che l'identificazione del tipo di file sia semplice come nel caso del RAR: "Rar!".
      Se anche questo riconoscimento fallisce, il programma terminerà con due beep.
  3. Espansione del file:
    1. Prima di tutto viene ricavato il nome della directory temporanea dal nome del file senza l'estensione.
    2. Se la directory temporanea ancora non esiste (perchè non è stata precedentemente avviata un'altra sessione, ancora attiva, del programma sullo stesso file) la crea. Se non è possibile crearla, perché ad esempio il percorso del parametro expandpath è sbagliato, il programma termina emettendo tre beep.
    3. Viene espanso il file compresso tramite il relativo comando. Se l'operazione di espansione fallisce, il programma termina con quattro beep.
    4. A questo punto l'icona del file compresso viene aggiornata e la nuova directory viene aperta tramite la routine esterna openobj().
  4. Monitoraggio cartella aperta:
    Dato che la directory in cui viene scompattato il file deve essere cancellata con tutto il suo contenuto, quando non abbiamo più bisogno di essa, è necessario trovare un sistema per comunicare al programma che essa non è più necessaria. La libreria di funzioni di utilità inclusa nell'object REXX di Warp 4 ci permette di ottenere l'elenco delle finestre attive tramite la funzione SysQuerySwitchList(). Tale funzione è purtroppo presente solo nella versione delle librerie REXXUTIL di Object REXX, per cui, nel caso non sia installato quest'ultimo, le directory temporanee verranno cancellate dall'apposito script ad ogni avvio del sistema.
  5. Alla chiusura della cartella, la directory temporanea verrà rimossa e verrà ripristinata l'icona originaria del file compresso.

Note sull'installazione e uso

Dopo aver scompattato unpacker.zip in una directory temporanea, dovrete copiare i vari file nella posizione definitiva.
Se avete installato Object REXX, potrete usare lo script UNPACK-O.CMD, altrimenti dovrete usare UNPACK-C.CMD.
Copiate uno di questi due file in una directory di vostra scelta rinominandolo UNPACKER.CMD. Nella stessa directory copiate anche UNPACKER.ICO e UNPACK1.ICO, mentre DELTREE.CMD e OPENOBJ.CMD dovranno essere copiati in una directory compresa nel PATH del CONFIG.SYS, per esempio \OS2.
Modificate le impostazioni di UNPACKER.CMD o, se preferite di un oggetto programma che faccia riferimento ad esso:

  1. Selezionate il separatore Programma:
    1. Se avete creato un oggetto programma, nel campo Percorso e nome del file: scrivete il nome del file UNPACKER.CMD incluso il percorso completo. Se modificate direttamente le impostazioni di UNPACKER.CMD questo campo sarà già a posto.
    2. Nel campo parametri scrivete il percorso completo della directory in cui volete siano create le subdirectory temporanee ed eventualmente create anche la directory se ancora non esiste.
    3. Sempre nel campo parametri, dopo il nome della directory, lasciate uno spazio e scrivete "%*" (senza le virgolette). Cioè nel caso la directory prescelta sia C:\UNZIPTMP, dovremo scrivere:
      C:\UNZIPTMP %*
      
  2. Selezionate il separatore Sessione:
    1. Selezionate il pulsante finestra OS/2.
    2. Selezionate Avvia ridotto al minimo.
    3. Selezionate Chiusura al termine.
    4. Nel caso ci siano problemi di funzionamento potrete temporaneamente deselezionare le precedenti due voci per poter leggere i messaggi di errore.
  3. Selezionate il campo Associazione
    1. Nel campo Nuovo nome: scrivete: *.ZIP , premete Aggiungere e ripetete l'operazione con *.ARJ e *.RAR.
Se non li avete, procuratevi i programmi UNZIP, UNRAR e UNARJ o eventualmente editate lo script per adattarlo ai programmi in vostro possesso. Se aggiungete nuovi programmi ricordatevi di aggiungere anche l'associazione relativa.
Per evitare che a causa di un crash del sistema non vengano cancellate le directory temporanee e per cancellare le directory temporanee se non avete installato Object REXX, create un oggetto programma nella cartella di Avviamento:
  1. Selezionate il separatore Programma:
    1. Nel campo Programma: scrivete:
      DELTREE.CMD
      
    2. Nel campo Parametri: scrivete il percorso completo delle directory in cui UNPACKER crea le subdirectory contemporanee seguito da "\*", uno spazio e "-B". Cioè supponendo che la directory che abbiamo scelto sia C:\UNZIPTMP, dovremo scrivere:
      C:\UNZIPTMP\* -B
      
  2. Selezionate il separatore Sessione e impostatelo come per il programma UNPACKER.

DELTREE.CMD e OPENOBJ.CMD possono essere usati anche indipendentemente da UNPACKER.CMD.
Il primo funziona in modo analogo all'omonimo comando del DOS, mentre il secondo permette di aprire un oggetto (cartella, oggetto astratto o fisico) da riga di comando.
E' inoltre indispensabile che anche i vari programmi di scompattazione (UNZIP.EXE, UNRAR.EXE, UNARJ.EXE, UNPACK.EXE e UNPACK2.EXE) siano situati anch'essi in una delle directory facenti parte del PATH. In alternativa sarà necessario editare UNPACKER.CMD aggiungendo ai rispettivi comandi (unzip, unrar, ecc) il percorso in cui sono presenti gli eseguibili. E' anche possibile usare RAR.EXE al posto di UNRAR.EXE editando il relativo comando nello script.
I vari file di scompattazione sono reperibili nella subdirectory pub/os2/util/archiver di Hobbes e presso gli altri siti che distribuiscono software per OS/2.

Nel caso i file *.ZIP, *.ARJ, ecc. siano stati associati in precedenza ad un altro programma, pre aprirli dovremo scegliere la voce Unpacker dal menu contestuale del file, o cancellare le associazioni dal blocco impostazioni degli altri programmi per poter aprire i file compressi con un semplice doppio click.
Nel caso i file compressi non abbiano un'estensione standard per aprirli dovremo trascinarli sull'icona di Unpacker.

Conclusioni

Nei prossimi numeri esamineremo in dettaglio l'implementazione delle varie funzioni svolte dal programma e vedremo come espanderlo aggiungendogli nuove funzionalità.


a cura di Alessandro Cantatore

[Pagina precedente] -- [Sommario] -- [Home Page] -- [Pagina successiva]