Attention : Le contenu de ces pages n'a pas été mis à jour depuis longtemps. Il est probablement obsolète pour Firefox 4.0/Gecko 4.0 et supérieur. Pour du contenu plus récent, allez consulter developer.mozilla.org.

Readfile

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é.

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 file.exists() vous indique si le fichier à ouvrir existe ou non et la méthode sis.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.


Copyright © 2003-2013 association xulfr, 2013-2016 Laurent Jouanneau - 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.