Accéder
au système de fichiers en JavaScript
Grâce au "FileSystemObject" de la bibliothèque de scripts Microsoft, il est possible de manipuler des fichiers (lecture, écriture), des répertoires (déplacement, suppression). Ou comment JavaScript peut faire aussi bien que des langages comme Php ou Cold Fusion.
Si vous souhaitez profiter des fonctionnalités offertes
par ActiveXObject(), il vous faut posséder au moins IE 4.
Pour résumer, le rôle de cette fonction est de vous
permettre d'accéder à un objet ActiveX à partir
d'un langage de script, ici JavaScript.
Notez que l'usage de ces objets est soumise aux restrictions
de sécurité de vos navigateurs. Des paramètres
trop contraignants provoquent parfois l'affichage d'un message de
ce type : "Error message Automation server can't create object".
Pour en savoir plus sur les "Automation server", consultez
notre
tutoriel "OLE et les objets automates (Automation Objects)".
Grâce au "FileSystemObject" de la bibliothèque
de scripts Microsoft, il est possible de manipuler des fichiers
(lecture, écriture), des répertoires (déplacement,
suppression). Ou comment JavaScript peut faire aussi bien que des
langages comme Php ou Cold Fusion.
Quelques exemples pour nous échauffer
Ces fonctions n'ont rien de compliqué à partir du
moment où l'on comprend qu'avant d'accéder à
l'une des nombreuses
méthodes (ce lien vous donne aussi leur syntaxe) du "FileSystemObject",
il faut s'y connecter.
Tout commence en effet par :
var fso = new ActiveXObject("Scripting.FileSystemObject");
Grâce à notre instance "fso" nous allons
pouvoir manipuler les méthodes de l'objet FileSystemObject,
lui-même issu du "Microsoft's Scripting Engine".
L'accès aux méthodes étant résolu,
le plus dur est fait ! Il nous suffit maintenant de nous conformer
à la syntaxe de chacune d'elles.
Voyons comment créer par exemple un fichier texte. Nous
supposons que l'instance "fso" est déjà
créee.
var newFileObject = fso.CreateTextFile("nom_fichier",
true);
Le paramètre "true" sert à écraser
un fichier de même nom éventuellement existant.
De même, pour tester si un lecteur "x" existe sur
votre configuration, il suffit d'écrire :
DriveExist = fso.DriveExists("x");
Le résultat est fourni sous forme d'un booléen, il
est ainsi aisé de tester la valeur de DriveExist pour agir
en conséquence.
Les champs d'applications de ces méthodes sont vastes :
- Traitements de fichier (copie, déplacement, création,
effacement, lecture, écriture)
- Traitements de répertoires (copie, déplacement,
création, effacement)
- Vérification d'existence de fichiers, de répertoires,
de disques.
Et d'autres encore... Reportez-vous au lien précédent
pour une liste exhaustive des méthodes disponibles.
Nous l'avons vu, ces méthodes sont très simples à
utiliser. Plutôt que d'aligner ici la liste des méthodes
disponibles, les unes à la suite des autres, voyons comment
certaines d'entres elles peuvent être utilisées conjointement.
Nous décidons ici de construire une petite application capable
de gérer une partie du traitement lié à la
gestion d'un stock de photos. Ce programme peut s'avérer
utile pour un back-office par exemple.
Notre application
Avant de voir plus en détails quelques éléments
du code qui la compose, définissons tout d'abord le but et
le fonctionnement de notre application.
Il s'agit ici de traiter des fichiers ".jpg" ou ".gif"
uploadés par un "client" sur votre serveur. S'il
s'agit d'un nouveau client, nous devons lui créer un répertoire
capable de stocker ses images. Celles-ci doivent être classées
en fonction de leur type, "jpg" ou "gif" dans
des répertoires différents.
Une fois ces traitements effectués, il faut effacer
les images du client qui se trouvent dans le répertoire "upload".
Enfin, chaque client traité est répertorié
dans un fichier texte, nommé "log.txt", où
figurent uniquement le nom des clients.
Si vous souhaitez tester cette application, il est important de
respecter les instructions qui vont suivre.
Le fichier ".htm", qui contient le code JavaScript, doit
être placé au même niveau que le répertoire
"upload". Ce répertoire contient un sous-répertoire
portant le nom du client à traiter. Les images de ce client
sont stockées dans ce sous-répertoire.
Le but est donc de créer toujours au même niveau que
le fichier ".htm" un répertoire portant le nom
du client, contenant deux sous-répertoires, un nommé
"jpg" et l'autre nommé "gif", destinés
à stocker respectivement les images de type ".jpg"
et ".gif". Enfin, le répertoire du client stocké
dans "upload" doit disparaître.
Voici le code de cette petite application, nous vous conseillons
de le "copier / coller" dans un éditeur de votre
choix afin de bénéficier de la coloration syntaxique.
<html>
<head>
<title>Exemple d'utilisation de fonctions d'accès au
File System</title>
<SCRIPT LANGUAGE="JavaScript">
<!--
function copydel()
{
// Cette fonction effectue les traitements finaux, copie...
fso.CopyFile(chemin_upload+"\\"+clientname+"\\*.jpg",
chemin_client_jpg);
fso.CopyFile(chemin_upload+"\\"+clientname+"\\*.gif",
chemin_client_gif);
// ... et effacement
fso.DeleteFolder(chemin_upload+"\\"+clientname, true);
alert('Traitement ok');
}
// On demande et stocke le nom du client
var clientname = prompt('Nom du client :', '');
// On instancie l'objet ActiveX, à faire une fois seulement.
var fso = new ActiveXObject("Scripting.FileSystemObject");
// On verifie si le repertoire de ce client existe deja
repExiste = fso.FolderExists(clientname);
// On calcule le "path" du repertoire client et du repertoire
upload
var chemin_client = fso.GetAbsolutePathName(clientname);
var chemin_upload = fso.GetAbsolutePathName("upload");
var chemin_client_jpg = chemin_client+"\\jpg";
var chemin_client_gif = chemin_client+"\\gif";
// On logge chaque nom de client traité dans le fichier log.txt
var fh
fh = fso.OpenTextFile("log.txt", 8, true)
fh.WriteLine(clientname);
fh.Close();
if (repExiste)
{
alert('Client connu');
// Appel de la fonction "copydel"
copydel();
}
else
{
alert('Nouveau client !');
// On cree le repertoire du client
ainsi que ses sous-repertoires "jpg" et "gif"
fso.CreateFolder(clientname);
fso.CreateFolder(chemin_client_jpg);
fso.CreateFolder(chemin_client_gif);
// Appel de la fonction "copydel"
copydel();
}
//-->
</SCRIPT>
</head>
<body>
Fonction JavaScript pouvant servir
dans un back-office par exemple...
</body>
</html>
Les méthodes utilisées dans cet exemple fonctionne
de la même manière que celles que nous avons précedemment
testé. Seules quelques lignes demandent donc des éclaircissements
:
La fonction "copydel" utilise à deux reprises
des concaténations :
fso.CopyFile(chemin_upload+"\\"+clientname+"\\*.jpg",
chemin_client_jpg);
fso.DeleteFolder(chemin_upload+"\\"+clientname,
true);
Il s'agit dans la première ligne de reconstituer le chemin
("path") du sous-répertoire du client dans "upload"
afin d'accéder aux fichiers images d'un certain type.
La seconde ligne reconstruit le même chemin à des fins
d'effacement cette fois.
Lorsque nous écrivons dans "log.txt"...
fh = fso.OpenTextFile("log.txt",
8, true);
fh.WriteLine(clientname);
fh.Close();
... Nous ouvrons le fichier "log.txt" en mode "Ajout"
(voir la syntaxe de la méthode), c'est le chiffre 8 qui définit
ce mode ("1" pour lire, et "2" pour écrire).
La méthode "WriteLine" permet d'écrire une
ligne dans le fichier et d'ajouter à la fin un saut de ligne.
Pour notre exemple ces méthodes d'accès sont aussi
efficaces que celles proposées par des langages "server-side",
elles permettent de mettre en place facilement des fonctionnalités
d'accès au système de fichier, sous réserve
bien sûr que les contrôles ActiveX soient acceptés
par le navigateur (ce qui peut être le cas pour une utilisation
en interne sur un back-office).
[Arnaud
Gadal 8 novembre 2001
, JDNet]
|