如果你想在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)开始, 你也可以在组件代码中使用上面这些代码.