javascript可以访问文件系统吗?

时间:2009-07-06 14:21:04

标签: javascript persistence tiddlywiki

我很确定答案是 NO ,因此google gear,adobe AIR等等。

如果我是对的,那么http://tiddlywiki.com如何运作?它是持久的,用javascript编写。它也只是一个没有外部(服务器端)依赖项的HTML文件。 WTF?在哪里/如何存储其状态?

6 个答案:

答案 0 :(得分:46)

Tiddlywiki有几种保存数据的方法,具体取决于使用的浏览器。 As you could see in the source

  • 如果启用了ActiveX,则使用Scripting.FileSystemObject。
  • 在基于Gecko的浏览器上,它尝试使用UniversalXPConnect。
  • 如果启用了Java,它将使用TiddlySaver Java小程序。
  • 如果启用了Java LiveConnect,它会尝试使用Java的文件类。

答案 1 :(得分:36)

HTML5的文件[1],FileWriter [2]和FileSystem [3] API可在Google Chrome的最新开发者频道中找到。 FileSystem API允许您读取/写入浏览器知道的空间内的沙箱文件系统。例如,您不能在用户的本地FS上打开“我的图片”文件夹并对其进行读/写。这是在起作用的东西,但它暂时还没有准备好。编写文件的示例:

window.requestFileSystem(
  TEMPORARY,        // persistent vs. temporary storage
  1024 * 1024,      // 1MB. Size (bytes) of needed space
  initFs,           // success callback
  opt_errorHandler  // opt. error callback, denial of access
);

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

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

      writer.onwrite = function(e) {
        console.log('Write completed.');
      };

      writer.onerror = function(e) {
        console.log('Write failed: ' + e.toString());
      };

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

    }, errorHandler);
  }
}

查看此HTML5 Storage slide deck以获取更多代码段。

答案 2 :(得分:12)

它使用如下的java文件引用:

drivers.tiddlySaver = {
        name: "tiddlySaver",
        deferredInit: function() {
            if(!document.applets["TiddlySaver"] && !$.browser.mozilla && !$.browser.msie && document.location.toString().substr(0,5) == "file:") {
                $(document.body).append("<applet style='position:absolute;left:-1px' name='TiddlySaver' code='TiddlySaver.class' archive='TiddlySaver.jar' width='1'height='1'></applet>");
            }
        },
        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;
        }
    }

答案 3 :(得分:4)

从技术上讲,你可以做到

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

在兼容netscape的浏览器(Firefox,Mozilla,Netscape)中,它会询问用户*是否允许文件系统访问,但这不可移植。

*每个浏览器进程一次

答案 4 :(得分:4)

  

javascript可以访问文件系统吗?

据我所知,不在上述沙箱区域之外。但是,它可以访问已签名的Java applet,该applet具有可调用的公共方法,可以访问所有文件。我已经完成了它并且工作正常并且是跨浏览器。

签名部分涉及到一些专业用途,您可能需要支付授权您身份的代码签名证书。从Verisign这样的地方买到它。这样用户至少知道applet是由谁编写的(如果有帮助的话)。您可以免费自行签名,但在首次使用时会出现其中一个“可能的安全风险”弹出窗口,以供用户授权。

您会认为这样的已签名的文件编写小程序已经存在供下载但我找不到任何通过搜索。如果他们这样做了,你可以将它插入你的页面,学习API,然后离开。

答案 5 :(得分:2)

答案确实没有。如果需要,通常会使用Java小程序和可怕的ActiveX插件