NetUtil.asyncCopy从一个文件追加到Firefox扩展中的另一个文件

时间:2012-12-21 22:36:43

标签: javascript asynchronous io firefox-addon

我正在尝试使用NetUtil.asyncCopy将数据从一个文件附加到Firefox扩展中的另一个文件的末尾。我已将此代码基于https://developer.mozilla.org/en-US/docs/Code_snippets/File_I_O上的一些示例,特别是“将流复制到文件”示例。鉴于它在该页面上的内容,我的代码如下:

  1. 为要复制的文件和要追加的文件创建nsIFile对象,并使用正确的路径初始化这些对象。

  2. 创建输出文件的输出流。

  3. 运行NetUtil.asyncCopy函数以在文件(我相信,它表现为nsIInputStream)和输出流之间进行复制。

  4. 我将此代码作为append_text_from_file("~/CopyFrom.txt", "~/AppendTo.txt");运行,但没有任何内容被复制。 Appending TextAfter ostream转储显示在控制台上,但不显示DoneError转储。

    有谁知道我在这里做错了什么?我对Firefox扩展和javascript都很陌生(虽然我是一个相当有经验的程序员) - 所以我可能会做一些非常愚蠢的事情。如果我的整个方法都是错误的那么请告诉我 - 我会认为这种方法可以让我轻松地,异步地附加文件,但由于某些我不知道的原因,这可能是不可能的。

    function append_text_from_file(from_filename, to_filename) {
            var from_file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
            from_file.initWithPath(from_filename);
    
            var to_file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
            to_file.initWithPath(to_filename);
    
            dump("Appending text\n");
    
            var ostream = FileUtils.openFileOutputStream(to_file, FileUtils.MODE_WRONLY | FileUtils.MODE_APPEND)
            dump("After ostream\n");
            NetUtil.asyncCopy(from_file, ostream, function(aResult) {
                dump("Done\n");
                if (!Components.isSuccessCode(aResult)) {
                    // an error occurred!
                    dump(aResult);
                    dump("Error!\n")
                }
            });
        }
    

1 个答案:

答案 0 :(得分:1)

asyncCopy()需要输入流而不是文件。 你可以这样做:

    var fstream = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(Ci.nsIFileInputStream);
    fstream.init(from_file, 0x01, 4, null);

    NetUtil.asyncCopy(fstream, ostream, function(aResult)....