1

我的附加组件 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')克隆并且这有效,但仅当插件将<em:unpack>指令设置为 true 时install.rdf

即使加载项被压缩,我们如何获得有效的路径?

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

4

1 回答 1

2

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

以下应该创建一个nsIUTF8StringEnumerator您可以迭代的。与模式匹配的 zip 文件的内容是使用获得的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. 
}
于 2014-11-21T21:16:19.240 回答