我的附加组件Color Source需要迭代我的附加组件中的目录中的文件(例如,content
子目录),当附加组件未解包时(即,保持压缩为XPI)。
我们使用这样的代码来获取Addon对象:
Cu.import("resource://gre/modules/AddonManager.jsm", null)
.AddonManager
.getAddonByID(
"color_source@brett.zamir",
function(addon) {
var uri = addon.getResourceURI();
}
);
为了将路径传递给new OS.File.DirectoryIterator
,我们尝试了:
OS.Path.join(uri.path, 'content');
显然适用于* nix但不适用于Windows uri.QueryInterface(Ci.nsIFileURL).file
,然后在克隆上调用append('content')
,这是有效的,但仅当加载项在{{1}中将<em:unpack>
指令设置为true时}}。即使加载项被压缩,我们如何获得有效的路径?
(注意:我在这篇文章中添加了一个Firefox附加标签,因为那里的问题应该类似)
答案 0 :(得分:2)
.xpi
文件是一个zip文件,应使用nsIZipReader
访问。
以下内容应创建一个nsIUTF8StringEnumerator
,您可以在其上进行迭代。使用findEntries()
Components.utils.import("resource://gre/modules/FileUtils.jsm");
var zipReader = Components.classes["@mozilla.org/libjar/zip-reader;1"]
.createInstance(Components.interfaces.nsIZipReader);
var addonFile = new FileUtils.File(uri.path);
zipReader.open(addonFile);
var contentEnumerator = zipReader.findEntries("content/*");
这应该为您提供content
目录中包含的所有文件和目录。但是,您可能只对直接位于内容目录中的文件感兴趣:
for(contentFile of contentEnumerator) {
if(/content\/.*\//.test(contentFile) {
continue;
}
//If you get here contentFile should contain only direct descendants of
// the content directory.
}