Javascript Firefox插件读取本地XPI、文件和目录列表

Javascript Firefox插件读取本地XPI、文件和目录列表,javascript,firefox-addon,firefox-addon-restartless,Javascript,Firefox Addon,Firefox Addon Restartless,在#amo编辑器中聊天后,我想知道Firefox插件是否可以实现以下功能: 打开本地XPI进行读取 列出上述XPI中的所有文件及其大小 读取选定文件 绝对可能 1+2)必须使用nsIZipReader读取xpi。这将提供其中的所有文件 3) 要读取内容,您必须使用zip阅读器getInputStream函数,然后将其包装到流实例中,然后使用entry参数读取内容。realSizeasreadon stream需要读取字符 编辑:我很好奇。我想我明白了。下面是如何使其转储zip内容的示例(列

在#amo编辑器中聊天后,我想知道Firefox插件是否可以实现以下功能:

  • 打开本地XPI进行读取
  • 列出上述XPI中的所有文件及其大小
  • 读取选定文件
  • 绝对可能

    1+2)必须使用nsIZipReader读取xpi。这将提供其中的所有文件

    3) 要读取内容,您必须使用zip阅读器
    getInputStream
    函数,然后将其包装到流实例中,然后使用
    entry参数读取内容。realSize
    as
    read
    on stream需要读取字符


    编辑:我很好奇。我想我明白了。下面是如何使其转储zip内容的示例(列出其中的所有文件)。请参阅弹出“zip路径”的
    console.log(entryPointer)
    。它还读取文件的内容

    var zr = Cc["@mozilla.org/libjar/zip-reader;1"].createInstance(Ci.nsIZipReader);
    Cu.import('resource://gre/modules/osfile.jsm');
    Cu.import('resource://gre/modules/FileUtils.jsm');
    
    var reusableStreamInstance = Cc['@mozilla.org/scriptableinputstream;1'].createInstance(Ci.nsIScriptableInputStream);
    
    //var pathExtFolder = OS.Path.join(OS.Constants.Path.profileDir, 'extensions');
    var pathToXpiToRead = OS.Path.join(OS.Constants.Path.profileDir, 'extensions', 'PortableTester@jetpack.xpi');
    var nsiFileXpi = new FileUtils.File(pathToXpiToRead);
    
    //Services.ww.activeWindow.alert(pathToXpiToRead);
    
    try {
      zr.open(nsiFileXpi); //if file dne it throws here
      var entries = zr.findEntries('*');
      while (entries.hasMore()) {
        var entryPointer = entries.getNext(); //just a string of "zip path" (this means path to file in zip, and it uses forward slashes remember)
        var entry = zr.getEntry(entryPointer); // should return true on `entry instanceof Ci.nsIZipEntry`
        console.log('entryPointer', entryPointer);
        /* CONSOLE OUTPUT
         * "entryPointer" "bootstrap.js" Scratchpad/1:18
         */
        console.info('entry', entry);
        /* CONSOLE OUTPUT
         * "entry" XPCWrappedNative_NoHelper { QueryInterface: QueryInterface(), compression: Getter, size: Getter, realSize: Getter, CRC32: Getter, isDirectory: Getter, lastModifiedTime: Getter, isSynthetic: Getter, permissions: Getter, compression: 8 } Scratchpad/1:19
         */
        if (!entry.isDirectory) {
            var inputStream = zr.getInputStream(entryPointer);
            reusableStreamInstance.init(inputStream);
            var fileContents = reusableStreamInstance.read(entry.realSize);
            console.log('contenst of file=', fileContents);
        } else {
            console.log('is directory, no stream to read');
        }
      }
    } catch (ex) {
      console.warn('exception occured = ', ex);
      if (ex.name == 'NS_ERROR_FILE_NOT_FOUND') {
        Services.ww.activeWindow.alert('XPI at path does not exist!\n\nPath = ' + pathToXpiToRead);
      }
    } finally {
      zr.close();
      console.log('zr closed');
      //Cu.forceGC(); //im not sure shoud i do this here?
    }
    

    我不确定我是否应该在最后做一个
    Cu.forceGC()
    ,也许@nmaier可以给我们一些建议

    我也不确定我是否正确地读取了输入流,它可以工作,但我不知道内存方面的问题。我第一次这样做是
    .read(entry.realSize)

    条目上的变量查看器

    entry“>

    “我不确定我是否应该在最后一步中使用Cu.forceGC(),也许@nmaier可以就此向我们提供建议。”如果不必使用,请不要使用
    .forceGC()
    。不确定为什么要这样做?!无论如何,一旦删除不相关的位,甚至不尝试回答以下问题,您将得到我的+1”我没有读过zip,但我已经将文本直接写入zip……我重用流实例的方式是否正确?我是否应该在
    finally{}中执行
    reusableStreamInstance.close()
    ?我忘了我刚刚被编码和附加到这篇文章中的内容迷住了:P我把它拿出来了,还有更好的方法来做if not found flag的异常测试吗?事实上,答案应该是回答问题,而不是问新问题?!:P无论如何,你不应该重用流(流包装器);这有点违反约定,即使它在本例中有效。您应该从
    zr关闭inputStream(或围绕它的脚本流包装器)。getInputStream()
    zr.open()
    应该在try-finally块之外,但在另一个(外部)中试试block。等等。哈哈,这可能是个好主意。只是我觉得这个答案可能更好。我在帮助别人的同时学习。我可以让事情顺利进行,但我不知道事情是如何进行的,如果它们坏了。我会在那里发布这个代码,谢谢你。