37 votes

Peut JavaScript accéder à un système de fichiers ?

J'étais assez sûr que la réponse était NON, et donc google gears, adobe AIR, etc.

Si j'avais raison, alors comment fonctionne http://tiddlywiki.com ? C'est persistant et écrit en javascript. C'est aussi juste un fichier HTML unique qui n'a aucune dépendance externe (côté serveur). WTF ? Où/comment stocke-t-il son état ?

46voto

Zr40 Points 1538

Tiddlywiki a plusieurs méthodes pour sauvegarder des données, en fonction du navigateur utilisé. Comme vous pouvez le voir dans la source.

  • Si ActiveX est activé, il utilise Scripting.FileSystemObject.
  • Sur les navigateurs basés sur Gecko, il essaie d'utiliser UniversalXPConnect.
  • Si Java est activé, il utilise l'applet Java TiddlySaver.
  • Si Java LiveConnect est activé, il essaie d'utiliser les classes de fichier Java.

36voto

ebidel Points 11312

Les API File[1], FileWriter[2] et FileSystem[3] d'HTML5 sont disponibles dans la dernière version du canal des développeurs de Google Chrome. L'API FileSystem vous permet de lire/écrire dans un système de fichiers sandbox dans un espace que le navigateur connaît. Vous ne pouvez pas, par exemple, ouvrir le dossier 'Mes images' sur le système de fichiers local de l'utilisateur et y lire/écrire. C'est quelque chose en cours de développement, mais cela ne sera pas prêt avant un certain temps. Exemple d'écriture d'un fichier:

window.requestFileSystem(
  TEMPORARY,        // stockage persistant vs. temporaire
  1024 * 1024,      // 1Mo. Taille (en octets) de l'espace nécessaire
  initFs,           // fonction de réussite
  opt_errorHandler  // fonction d'erreur optionnelle, refus d'accès
);

function initFs(fs) {
  fs.root.getFile('fichierLog.txt', {create: true}, function(fileEntry) {

    fileEntry.createWriter(function(writer) {  // FileWriter

      writer.onwrite = function(e) {
        console.log('Écriture terminée.');
      };

      writer.onerror = function(e) {
        console.log('Écriture échouée : ' + e.toString());
      };

      var bb = new BlobBuilder();
      bb.append('Lorem ipsum');
      writer.write(bb.getBlob('text/plain'));

    }, errorHandler);
  }
}

Consultez cette diapositive sur le stockage HTML5 pour plus d'exemples de code.

12voto

Rich Bradshaw Points 33598

Il utilise des références de fichiers Java comme ceci :

drivers.tiddlySaver = {
        name: "tiddlySaver",
        deferredInit: function() {
            if(!document.applets["TiddlySaver"] && !$.browser.mozilla && !$.browser.msie && document.location.toString().substr(0,5) == "file:") {
                $(document.body).append("");
            }
        },
        isAvailable: function() {
            return !!document.applets["TiddlySaver"];
        },
        loadFile: function(filePath) {
            var r;
            try {
                if(document.applets["TiddlySaver"]) {
                    r = document.applets["TiddlySaver"].loadFile(javaUrlToFilename(filePath),"UTF-8");
                    return (r === undefined || r === null) ? null : String(r);
                }
            } catch(ex) {
            }
            return null;
        },
        saveFile: function(filePath,content) {
            try {
                if(document.applets["TiddlySaver"])
                    return document.applets["TiddlySaver"].saveFile(javaUrlToFilename(filePath),"UTF-8",content);
            } catch(ex) {
            }
            return null;
        }
    }

6voto

John Points 61

La réponse se trouve dans le futur, cela arrivera. Voir http://www.w3.org/TR/FileAPI/. Avec Firefox 3.6.8, voir http://www.html5rocks.com/tutorials/file/dndfiles/ pour des exemples avec du code source.

4voto

Jason S Points 58434

Techniquement, vous pouvez le faire

netscape.security.PrivilegeManager.enablePrivilege('UniversalBrowserWrite');

dans un navigateur compatible avec Netscape (Firefox, Mozilla, Netscape), et il demandera à l'utilisateur* s'il autorise ou non l'accès au système de fichiers, mais ce n'est pas portable.

*une fois par processus de navigation

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X