Mozilla's getting a new look. What do you think? https://mzl.la/brandsurvey

在chrome代码中使用DOM File API

如果你想在chrome代码中使用DOM File API,可以使用,且没有任何限制.事实上,你还获得了一个额外的特性:你可以通过传入文件的本地路径来创建一个 File对象.这个特性只在特权代码中可用,web页面中不可用.很明显,这是因为安全问题,否则网页可以读取到用户计算机中任意的本地文件.如果你在非特权代码(比如普通的web页面)中向File构造函数传入了一个路径字符串,则会抛出异常.

通过文件路径访问文件

想要通过文件路径引用到某个文件,你只需要传入一个路径字符串:

var file = File("path/to/some/file");

注: 由于windows和linux系统上使用的路径分隔符不同(这里使用了"/"),所以这样写会产生无法跨平台的问题.而且我们没有一个类似于Java中的File.pathSeparator来动态的获取到适合用户操作系统的路径分隔符.所以如果你的扩展程序需要跨平台,更好的做法是避免把路径写死(字符串形式),而是使用 nsIFile::append()方法来指定某个目录中所需要的文件,具体看下一节.

访问特殊目录中的文件

你也可以通过directory服务来获取到所需访问文件的路径.例如,你的附加组件需要访问用户的profile目录中的一个文件.你可以这样做:

var dsFile = Components.classes["@mozilla.org/file/directory_service;1"]
                    .getService(Components.interfaces.nsIProperties)
                    .get("ProfD", Components.interfaces.nsIFile);

dsFile.append("myfilename.txt");

var file = File(dsFile.path);

这个例子中使用到了directory服务获取到了用户的profile目录(使用键"ProfD"),然后通过调用nsIFile.append()方法获取到了所需访问的文件.最后,我们通过将nsIFile.path() 属性传入File构造函数来生成一个File对象.

还有更方便的方法,就是直接把一个nsIFile对象传入File构造函数:

var dsFile = Components.classes["@mozilla.org/file/directory_service;1"]
                    .getService(Components.interfaces.nsIProperties)
                    .get("ProfD", Components.interfaces.nsIFile);

dsFile.append("myfilename.txt");

var file = File(dsFile);

还有其他很多类似"ProfD"的键,请查看directory服务.

译者注:nsIFile对象比File对象强大多了,在扩展程序中,我们不可能需要将一个nsIFile对象转换成一个File对象.

备注

从Gecko 8.0 (Firefox 8.0 / Thunderbird 8.0 / SeaMonkey 2.5)开始, 你也可以在组件代码中使用上面这些代码.

相关链接

文档标签和贡献者

 此页面的贡献者: ziyunfei
 最后编辑者: ziyunfei,