1

NetUtil.asyncCopy を使用して、あるファイルのデータを Firefox 拡張機能の別のファイルの末尾に追加しようとしています。このコードは、https://developer.mozilla.org/en-US/docs/Code_snippets/File_I_Oの多くの例、特に「ストリームをファイルにコピーする」例に基づいています。そのページに書かれていることを考えると、以下の私のコード:

  1. コピー元のファイルと追加先のファイルの nsIFile オブジェクトを作成し、これらのオブジェクトを正しいパスで初期化します。

  2. 出力ファイルへの出力ストリームを作成します。

  3. NetUtil.asyncCopyファイル (nsIInputStream として動作すると思われます) と出力ストリームの間でコピーする関数を実行します。

このコードを として実行しますappend_text_from_file("~/CopyFrom.txt", "~/AppendTo.txt");が、何もコピーされません。Appending TextおよびAfter ostreamダンプはコンソールに表示されますが、またはDoneダンプは表示されませんError

ここで私が間違っていることを知っている人はいますか? 私は 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")
            }
        });
    }
4

1 に答える 1

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)....
于 2013-01-26T03:40:53.967 に答える