Gli operatori logici in Visual Basic Net? Li trovi su Opentraining.it Visual Basic Italia
Guide e Tutorials:indexed
Creare manualmente file Cabinet (.CAB)

Quando si va ad utilizzare un programma che genera pacchetti d'installazione, gran parte degli elementi del progetto da distribuire vengono compressi in un file Cabinet di estensione .cab.
In realtà l'utilizzo di un file .cab può risultare molto utile anche al di là della creazione di pacchetti d'installazione, ad esempio se si desidera nascondere o comprimere determinate componenti del progetto.
Ed è proprio questo che cominceremo a vedere in questo primo articolo: la creazione di un file Cabinet. I tre passaggi chiave per raggiungere lo scopo sono prima di tutto creare un file con estensione .ddf (Diamond Directive File) ossia un file che contiene tutte le direttive sui parametri di compressione da passare al programma di utilità MAKECAB.exe.
In secondo luogo si dovrà creare un file batch per avviare in modalità MS-DOS il file MAKECAB.exe con ulteriori parametri.
Infine si dovrà creare il file .cab semplicemente richiamando MAKECAB.exe e, se lo si desidera, rimuovere dalla cartella i file generati in eccesso.
Tutto ciò potrebbe sembrare molto complicato, in realtà è stato sufficiente un quarto d'ora per scrivere il codice relativo all'intero progetto.
E al di là della velocità è assicurata un'estrema semplicità nei concetti che si andranno a discutere.
Innanzitutto inseriamo nelle dichiarazioni generali del codice una variabile denominata 'nomeFileCab' rappresenterà il nome del file .cab da generare e quindi sarà una variabile di tipo String:

Dim nomeFileCab As String

e quindi dichiariamo un oggetto Collection che conterrà tutti i file da includere nel nuovo file .cab.
Siccome risulta particolarmente utile avere una matrice con tutti i nomi dei file per poterli utilizzare in seguito, è consigliato l'uso di questo tipo di oggetto.
In ogni caso se si hanno dubbi sull'utilizzo delle Collection fare riferimento all'articolo L'oggetto Collection:

Dim Insieme As New Collection

Adesso passiamo al primo punto dei tre: la creazione di un file .ddf che contiene i parametri della compressione. Generalmente tale file viene denominato 'direct.ddf' ma non c'è ragione per non assegnargli un nome differente.
Iniziamo a scrivere il codice di una nuova sottoprocedura alla quale verrà passato ad uno ad uno il percorso dei file da comprimere:

Private Sub InserisciFile(nomeFile As String)

Ogni volta che vorremo aggiungere un file alla compressione, esso verrà introdotto nella Collection in modo da essere recuperato più avanti:

Insieme.Add nomeFile

Notare che non è stato specificato l'indice che rappresenta la posizione del nuovo dato all'interno della Collection in questo modo ogni percorso sarà aggiunto come ultimo.
Prima di continuare è necessario chiedersi a cosa serva creare un file Diamond Directive File. L'applicazione che stiamo sviluppando non crea file .cab in modo autonomo, ma con l'ausilio del file MAKECAB.exe che si dovrebbe trovare nella directory C:\WINDOWS oppure nella cartella di Visual Studio.
MAKECAB.exe come dice il nome, comprime i file in un unico file .cab, ma per questo necessita di alcune direttive (il livello di compressione, i file da comprimere, il nome del file .cab da creare e così via).
Sarebbe possibile utilizzare MAKECAB.exe direttamente dall'applicazione 'Esegui' ma naturalmente un programma di creazione di pacchetti d'installazione non può chiedere all'utente di andarsi a comprimere i file da solo...
L'unico problema legato all'utilizzo di MAKECAB.exe da codice sta nel fatto che deve necessariamente essere presente nella cartella dell'applicazione o quanto meno se ne deve conoscere il percorso sul disco fisso. Se ne capirà in seguito il motivo.
Optiamo perciò per la prima soluzione controllando se il file è presente nella directory ed eventualmente interrompendo l'applicazione in caso negativo:

If Len(App.Path & "/MAKECAB.exe") = 0 Then
MsgBox "Il file MAKECAB.exe non è nella directory corrente."
End
End If

Adesso non ci rimane altro che creare un file .ddf, che può essere aperto utilizzando un semplice editor di testo scrivendo su di esso i parametri standard di compressione utilizzati dalle applicazioni Microsoft:

Open "C:\Documenti\VB\cab\Direct.ddf" For Output As #1
Print #1, ".Option Explicit"
Print #1, ".Set Cabinet=on"
Print #1, ".set Compress=on"
Print #1, ".Set MaxDiskSize=CDRom"
Print #1, ".set ReservePerCabinetSize=6144"
Print #1, ".Set DiskDirectoryTemplate="
Print #1, ".Set CompressionType=MSZip"
Print #1, ".Set CompressionLevel=7"
Print #1, ".Set CompressionMemory=21"
Print #1, ".Set CabinetNameTemplate=" & nomeFileCab & ".cab"

dove la direttiva ".Set Cabinet=on" indica la generazione di un file .cab, la direttiva ".set Compress=on" indica che i file aggiunti al file .cab devono essere compressi, la direttiva ".Set MaxDiskSize=CDRom" indica che non esistono dimensioni massime per il file .cab di nuova creazione (ossia lo spazio massimo è lo spazio contenuto in un cd rom, visto che i file .cab sono espressamente utilizzati per essere distribuiti su tale supporto).
".set ReservePerCabinetSize=6144" riserva spazio per la firma digitale ".Set CompressionMemory=21" indica invece quanta memoria utilizzare nel processo di creazione del file .cab, ".Set CompressionType=MSZip" indica invece il tipo di compressione, ".Set CabinetNameTemplate=" indica il nome del file .cab da generare e ".Set DiskDirectoryTemplate=" il nome della directory sul disco.
Adesso si andrà a scrivere nel file Direct.ddf ogni percorso incluso nell'oggetto Collection ossia ogni file che si desidera inserire nel file .cab e si chiude la sottoprocedura:

For Each elemento In Insieme
Write #1, elemento
Next elemento
Close #1
End Sub

Creiamo ora il codice per la seconda sottoprocedura, quella che genererà in modo effettivo il file .cab. E' utile separare le due procedure perchè in quella appena vista si aggiungono solo i file da comprimere alla lista mentre nella prossima si comprimono effettivamente.
Si andrà quindi a creare un file batch che simula l'azione dell'utente che al prompt di MS-DOS utilizza il file MAKECAB.exe.
Denominiamo tale file Batch.bat:

Private Sub CreaCAB()
Open App.Path & "\Batch.bat" For Output As #1

Cominicamo a cancellare tutto quello che non serve nella finestra MS-DOS:

Print #1, "@Echo Off"

il file batch (con estensione .bat) una volta creato e sistemato come abbiamo fatto sopra apparirà così:


ossia pronto ad operare nella directory WINDOWS. Siccome però dobbiamo eseguire il file MAKECAB.exe dal percorso della nostra applicazione, sarà necessario innanzitutto uscire dalla cartella corrente. Perciò:

Print #1, "cd\"

ed ora andiamo nella cartella dell'applicazione:

Print #1, "cd " & app.path

Infine si potrà andare ad eseguire il comando che richiama il file MAKECAB.exe:

Print #1, "Makecab /f Direct.ddf"

indicando come si nota il nome del file Diamond Directive File dal quale estrarre i parametri di compressione.
Se si decidesse di avviare il progetto con queste istruzioni nel file .bat, al termine della creazione del file .cab verrebbero creati nella cartella corrente due file. Il primo, denominato Setup.inf risulta utile per specificare la versione dei file compressi, per aggiungere la firma digitale e le note legali.
Un esempio di file .inf è il seguente:


Il secondo file creato è denominato invece Setup.rpt è il report generato dall'applicazione MAKECAB.exe ed include i dati dell'operazione di compressione appena terminata (percentuale di compressione, numero file presenti nel file .cab, durata dell'operazione di compressione e così via). Ad esempio:


Perciò si può decidere di mantenere tali file o cancellarli. Nel secondo caso si dovranno inserire le due istruzioni seguenti:

Print #1, "Del Setup.inf"
Print #1, "Del Setup.rpt"

In ogni caso comunque si potrà cancellare il file direct.ddf creato poco prima poichè una volta terminata l'operazione di compressione non risulta più utile, e chiudere il file batch.bat:

Print #1, "Del direct.ddf"
Close #1

Una volta compilato come abbiamo visto il file batch.bat che assegnerà le istruzioni all'applicazione MAKECAB, sarà necessario avviarlo. A questo scopo basterà fare uso di una semplice funzione Shell:

Shell App.Path & "\Batch.bat", vbHide
End Sub

dove il parametro vbHide della funzione Shell indica che verrà avviato Batch.bat come una finestra nascosta.
Per terminare l'applicazione manca solamente il passaggio dei percorsi dei file da comprimere. Sarebbe possibile organizzare un controllo ListBox in modo da permettere all'utente di inserire i file che desidera, ma in questo codice si passeranno i percorsi alla routine InserisciFile in modo molto semplice:

Private Sub Form_Load()
nomeFileCab = "dati"
InserisciFile "C:\Documenti\file1.zip"
InserisciFile "C:\Documenti\file2.zip"
CreaCAB
End Sub

La prima linea indica il nome del file .cab da generare. La seconda e la terza indicano i file da comprimere e la quarta richiama la routine CreaCAB per la creazione del file .cab

Scarica qui l'esempio completo per questo articolo


Archivio:ndexed
Lezioni Commenta questa lezione Invia la tua guida Avviso per le nuove lezioni
Proponi un argomento

Visual Basic Italia© copyright 2000 - tutti i diritti riservati
E-mail:
vbitalia@libero.it