如何迭代无提取加载项的.xpi文件中的目录中的文件

时间:2014-11-21 18:14:37

标签: firefox-addon thunderbird-addon

我的附加组件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,我们尝试了:

  1. OS.Path.join(uri.path, 'content');显然适用于* nix但不适用于Windows
  2. 获取然后克隆uri.QueryInterface(Ci.nsIFileURL).file,然后在克隆上调用append('content'),这是有效的,但仅当加载项在{{1}中将<em:unpack>指令设置为true时}}。
  3. 即使加载项被压缩,我们如何获得有效的路径?

    (注意:我在这篇文章中添加了一个Firefox附加标签,因为那里的问题应该类似)

1 个答案:

答案 0 :(得分:2)

.xpi文件是一个zip文件,应使用nsIZipReader访问。

以下内容应创建一个nsIUTF8StringEnumerator,您可以在其上进行迭代。使用findEntries()

获取与模式匹配的zip文件的内容
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. 
}