2012-09-18 48 views
3

有没有一种方法可以在内容脚本中访问Fire Fox插件sdk中的Html5文件api?Firefox中的HTML5文件API Addon SDK

这是为了存储用户添加的单词及其含义所必需的。数据可能会变大,因此本地存储不是一种选择。

window.requestFileSystem3 = window.requestFileSystem || window.webkitRequestFileSystem; 

给我的错误类型错误:window.requestFileSystem3不是一个函数

我在问这是因为我从允许访问内容脚本中的文件api的Google Chrome扩展程序移植此代码。

其他问题

1)如果HTML5文件API是不允许的,然后我应该使用file模块?

2)文件模块是否允许访问文件系统上的任何文件,而不是只访问对文件系统进行沙盒访问的Html5文件api?

3)假设我必须使用文件模块什么是存储我的文件的最佳位置(如用户配置文件目录或扩展目录)以及如何在代码中获取此路径。

我很抱歉在这个问题中有这么多的子问题。谷歌对这个话题不是很有帮助。

任何示例代码将非常有帮助。

回答

5

Firefox不支持通过File API编写文件,即使这将被添加,它可能只能访问网页而不是扩展名。换句话说:是的,如果你绝对需要写入文件,那么你应该使用低级API。您想要将数据存储在用户配置文件目录中(没有扩展目录,您的扩展通常安装为单个打包文件)。像这样的东西应该工作写入文件:

var file = require("sdk/io/file"); 
var profilePath = require("sdk/system").pathFor("ProfD"); 
var filePath = file.join(profilePath, "foo.txt"); 
var writer = file.open(filePath, "w"); 
writer.writeAsync("foo!", function(error) 
{ 
    if (error) 
    console.log("Error: " + error); 
    else 
    console.log("Success!"); 
}); 

参考:sdk/io/filesdk/system

你可以使用TextReader.read()file.read()读取文件。不幸的是,附加SDK似乎不支持异步文件读取,因此读取会阻止Firefox UI。唯一的选择是通过镀铬的权威,一些进口NetUtilFileUtils这样的:

var {components, Cu} = require("chrome"); 
var {NetUtil} = Cu.import("resource://gre/modules/NetUtil.jsm", null); 
var {FileUtils} = Cu.import("resource://gre/modules/FileUtils.jsm", null); 
NetUtil.asyncFetch(new FileUtils.File(filePath), function(stream, result) 
{ 
    if (components.isSuccessCode(result)) 
    { 
    var data = NetUtil.readInputStreamToString(stream, stream.available()); 
    console.log("Success: " + data); 
    } 
    else 
    console.log("Error: " + result); 
}); 
+0

感谢这样一个详细的解答,并为+1异步文件读取提示。你是一个拯救生命的人:)。 –

+1

好的答案......只需要补充一点:现在记录了“系统”:https://addons.mozilla.org/en-US/developers/docs/sdk/latest/modules/sdk/system.html。另一方面,我们现在不再需要关闭'writeAsync'回调中的'writer'流,否则会导致一个错误:https://addons.mozilla.org/en-US/developers/docs/sdk /latest/modules/sdk/io/text-streams.html#writeAsync%28str,%20callback%29。 –

+0

@SamuelCaillerie:谢谢,我已经更新了我的答案。 –

相关问题