火狐插件SDK中的HTML5文件API

3
有没有办法在 Fire Fox 插件 SDK 中的内容脚本中访问 Html5 文件 API?
这是为了存储用户添加的单词及其含义。数据可能会很大,因此本地存储不是一个选择。
 window.requestFileSystem3 = window.requestFileSystem || window.webkitRequestFileSystem;

给我报错TypeError: window.requestFileSystem3不是一个函数

我问这个问题是因为我正在从Google Chrome扩展程序移植此代码,该扩展允许在内容脚本中访问文件API。

其他问题

1)如果不允许使用HTML5文件API,则应该使用file模块吗?

2)文件模块是否允许访问文件系统上的任何文件,而不仅仅是Html5文件API只允许访问沙箱访问文件系统?

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

对于这个主题,我很抱歉有这么多子问题。谷歌在这个主题方面并没有提供太多帮助。

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

1个回答

6

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()来读取文件。不幸的是,Add-on SDK似乎不支持异步文件读取,因此读取操作将会阻塞Firefox用户界面。唯一的替代方法是通过chrome权限导入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);
});

感谢您提供如此详细的答案,以及异步文件读取提示的加分。您真是我的救星 :)。 - Pankaj Kumar
1
很好的回答...补充一下:system现在已经有文档了: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。 - Samuel Caillerie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接