Ressources Libs/read File

Lecture d'un fichier local

De nombreux langages offrent des solutions simples pour lire un fichier sur votre disque dur. La technique utilisée par Mozilla nécessite l'emploi d'interfaces XPCOM pour accéder à vos fichiers, ainsi que des privilèges accrus.

Il n'existe pas de fonction prédéfinie en javascript permettant de réaliser une telle opération, et il existe plusieurs méthodes de lecture d'un fichier. C'est pour cette raison que le script peut paraître compliqué.

http://xulfr.org/images/RessourcesLibs_readfile.png

Le code

(voir aussi :le même code, entièrement commenté)

 <?xml version="1.0" encoding="ISO-8859-1" ?>
 <?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
 <window title="Test de lecture d'un fichier"
        xmlns:html="http://www.w3.org/1999/xhtml"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
        onload="rempli()"
        >

 <script><![CDATA[
 function rempli() {
  var uri = "<mettre ici le chemin vers votre fichier>";
  var txt = read(uri);
  //Affichage du contenu en échappant les caractères xml
  txt = txt.replace(/&/g, '&amp;');
  txt = txt.replace(/</g, '&lt;');
  txt = txt.replace(/>/g, '&gt;');
  document.getElementById('contenu').innerHTML = txt;
  //Un peu de cosmétique, affichage du chemin du fichier en bas de la fenêtre
  document.getElementById('nom_fichier').value = "Fichier : " + uri;
 }

 function read(filepath) {
 try  {
  //On autorise le navigateur a ouvrir des fichiers locaux
  //si par exemple, le script n'est pas lancé depuis une adresse chrome
  netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
 } catch (e) {
  alert("Permission refusée de lire le fichier");
  return ;
 }

 //Le fichier est ouvert
 var file =  Components.classes["@mozilla.org/file/local;1"]
            .createInstance(Components.interfaces.nsILocalFile);
 file.initWithPath(filepath);
 if ( file.exists() != true) {
  alert("Le fichier "+filepath+" n'existe pas");
  return ;
 }

 //Mode de lecture du fichier, un flux est nécessaire
 //Le second argument définit les différents modes de lecture parmis
 //PR_RDONLY     =0x01 lecture seulement
 //PR_WRONLY     =0x02 écriture seulement
 //PR_RDWR       =0x04 lecture ou écriture
 //PR_CREATE_FILE=0x08 si le fichier n'existe pas, il est créé (sinon, sans effet)
 //PR_APPEND     =0x10 le fichier est positionné à la fin avant chaque écriture
 //PR_TRUNCATE   =0x20 si le fichier existe, sa taille est réduite à zéro
 //PR_SYNC       =0x40 chaque écriture attend que les données ou l'état du fichier soit mis à jour
 //PR_EXCL       =0x80 idem que PR_CREATE_FILE, sauf que si le fichier existe, NULL est retournée
 //Le troisième argument définit les droits
 var is = Components.classes["@mozilla.org/network/file-input-stream;1"]
         .createInstance( Components.interfaces.nsIFileInputStream );
 is.init(file, 0x01, 00004, null);

 //Lecture du fichier en mode binaire
 var sis = Components.classes["@mozilla.org/binaryinputstream;1"]
          .createInstance(Components.interfaces.nsIBinaryInputStream);
 sis.setInputStream( is );
 var output = sis.readBytes( sis.available() );

 //Le contenu du fichier est retourné
 return output;
 }
 ]]></script>

 <html:h1>Test de lecture d'un fichier</html:h1>
 <hbox style = "overflow: auto;" flex="1">
   <html:pre id="contenu">...</html:pre>
 </hbox>
 <label value="..." id="nom_fichier"/>

 </window>

Explications

La fonction débute par l'obtention de privilèges supplémentaire pour accéder à votre système de fichiers. C'est une condition obligatoire si vous lancez cette page en local, mais inutile si vous la lancez depuis une adresse chrome.

Ensuite, la fonction nécessite trois interfaces :

  • une pour accéder au fichier (objet file)
  • une pour ouvrir un flux sur ce fichier dans un mode de lecture/écriture (objet is)
  • une pour lire les données de ce flux (objet sis)

Vous noterez que la méthode httpfile.exists() vous indique si le fichier à ouvrir existe ou non et la méthode httpsis.available() retourne la taille du fichier

Nota bene

La page XUL contient des éléments de l'espace de nommage html pour faciliter l'affichage du contenu du fichier retourné. Ce n'est bien entendu pas obligatoire pour cette fonction. La boîte <hbox> contenant l'attribut flex permet d'élargir automatiquement le contenu du fichier à la dimension de votre fenêtre.

Dernière modification le avril 23, 2006 4:10 .


Le contenu de cette page est disponible selon certaines conditions de réutilisation. Lire aussi la page des informations légales.

Mozilla® est une marque déposée de la fondation Mozilla.
Mozilla.org™, Firefox™, Thunderbird™, Mozilla Suite™ et XUL™ sont des marques de la fondation Mozilla.