Créer un fichier container pour enregistrer un dossier complet
L'exemple de la balancoire
Le fichier d'animation par Excel VBA "la balancoire" (cliquez ici)
nécessite la mise en oeuvre de plusieurs fichiers son.
Afin d'éviter de devoir enregistrer tous les fichiers son avant d'executer l'animation,
on peut placer l'ensemble des fichiers (le fichier Excel et les fichiers son) dans un seul fichier VBScript.
Le fichier se compose de deux parties, une partie script servant à restaurer les fichiers, et une partie "octets" dans laquelle seront stockés tous les fichiers constituant l'animation.
A l'execution, le script va lire les octets et les utiliser pour reconstituer le fichier Excel et les fichiers son dans le répertoire des fichiers temporaires.
Principale difficulté, la partie "octets", insérée dans le fichier vbs, va être lue à l'execution du vbs, et considérée comme des instructions vbs, qui ne pourront évidemment pas être interprétées comme telles et conduiront à des erreurs d'execution.
Pour éviter cela, il suffit de les transformer en commentaires en faisant suivre tous les sauts de ligne par une apostrophe.
Les fichiers stockés dans la partie "octets" sont séparés les uns des autres par des "tags" permettant de les repérer :
Chaque paquet d'octets est précédé d'une ligne 'FICHIER1, 'FICHIER2, 'FICHIER3... suivie d'une ligne indiquant le nom du fichier (par exemple zaza.wav)
et chaque paquet d'octets est suivi d'un signal de fin de fichier 'FINFICH.
Sur ces principes, les grandes lignes du script sont donc :
Auto-ouverture en lecture du fichier script où doivent être récupérés les octets :
Set fs = CreateObject("Scripting.FileSystemObject")
Set fichsource = fs.OpenTextFile(Wscript.ScriptFullName, 1,False)
(Notez que l'ouverture en lecture du fichier vbs n'en perturbe pas l'execution en cours).
Choix du répertoire dans lequel vont être reconstitués les fichiers, par exemple le répertoire TEMP :
Set sh = WScript.CreateObject("WScript.Shell")
repacc=sh.Environment("PROCESS")("TEMP")
Bouclage sur les numéros de fichier numfich.
Le fichier source est lu par lignes dans lesquelles on recherche successivement 'FICHIER1, 'FICHIER2, 'FICHIER3...
do while not instr(txt,"'FICHIER" & numfich)>0 and not fichsource.atendofstream'
txt=fichsource.readline
loop
La lecture de la ligne suivante donne le nom du fichier qui peut être recréé dans TEMP par OpenTextFile :
txt=fichsource.readline 'lire le nom du fichier
set fich=fs.OpenTextFile(repacc & right(txt,len(txt)-1),2,true)
(l'expression right(txt,len(txt)-1) permet d'éliminer l'apostrophe qui précède le nom du fichier pour le transformer en commentaire).
Il suffit alors de lire les octets par paquet (pour gagner du temps) jusqu'à rencontrer FINFICH, de retirer les apostrophes de commentaires et d'imprimer le paquet dans le nouveau fichier :
txte=fichsource.read(1024)
if instr(txte2,"'FINFICH" & numfich)>0 then txte2=left(txte2,instr(txte2,"'FINFICH" & numfich)-1)
txte2=replace(txte2,chr(13) & "'",chr(13))
txte2=replace(txte2,chr(10) & "'",chr(10))
fich.write txte2
(vision un peu simplifiée des choses).
Une fois tous les fichiers reconstitués dans TEMP, on peut lancer le fichier excel :
Set sh = WScript.CreateObject("WScript.Shell")
sh.run "explorer " & repacc & nom & "\flo.xls"
D'un seul clic sur le fichier vbs, l'utilisateur peut maintenant lancer l'animation.
Cliquez ici pour accéder directement au Script vbs (attention, 270 ko)
Cliquez ici pour accéder au texte du script zippé
Cliquez ici pour accéder au Script zippé