2012-02-16 2 views
1

こんにちは:私は最初にfirefox拡張機能を書いています(私の最初のこと)、イメージURLをバイト配列に読み込み、そのバイナリ情報をファイルに書き出します。私はthis exampleを使っていますが、それは動作しているかのように見えますが、文字変換が行われているかのようにファイルが正しくありません。次のようにjavacriptからのバイナリデータの書き込み(Firefoxプラグイン)

私のバージョンは次のとおりです。

testWriteBinaryFile : function (dir, filename, data) { 
    var aFile = Components.classes["@mozilla.org/file/local;1"]. 
     createInstance(Components.interfaces.nsILocalFile); 

    aFile.initWithPath("/home/mike/mypicture.gif"); 
    aFile.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0600); 
    Firebug.Console.log("Binary writing: file set up"); 

    var stream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"]. 
       createInstance(Components.interfaces.nsIFileOutputStream); 
    stream.init(aFile, 0x04 | 0x08 | 0x20, 0600, 0); // readwrite, create, truncate 
    Firebug.Console.log("Binary writing: stream set up"); 

    Firebug.Console.log("Data length: " + data.length); 
    Firebug.Console.log("Data byte 0: " + data[0].toString(16)); 
    Firebug.Console.log("Data byte 1: " + data[1].toString(16)); 
    Firebug.Console.log("Data byte 2: " + data[2].toString(16)); 
    Firebug.Console.log("Data byte 3: " + data[3].toString(16)); 
    Firebug.Console.log("Data byte 4: " + data[4].toString(16)); 

    stream.write(data, data.length); 
    Firebug.Console.log("Binary writing: stream written") 
    if (stream instanceof Components.interfaces.nsISafeOutputStream) { 
     stream.finish(); 
    } else { 
     stream.close(); 
    } 
    Firebug.Console.log("Binary writing: done."); 
} 

私はデータバッファ自体は最初の数バイトをプリントアウトすることでOKですが、ファイルがディスク上に一度完全に異なっている知っています。バイナリファイルを書き出すためのアイディアや他の方法

これは同期書き込みですが、ファイルは小さく(20Kb)ですが、これが唯一の例です。私はこれを修正することができれば、私は延長が完了しました!すべてのヘルプが感謝しています。

答えて

2

ここのコードは正常です(例: data"foo\0\n\rbar"の場合、その文字列はディスクに正しく書き込まれます。おそらく問題は、nsIOutputStream.write()がパラメータとして文字列を期待していることです。しかし、あなたはバイト配列について話しています。あなたのdata変数が実際にバイト配列であれば、多分それは、最初の文字列に変換するのが最も簡単です:

data = String.fromCharCode.apply(String, data); 

その操作dataした後、元のバイト配列に対応する文字列があるとnsIOutputStream.write()で使用することができます。より効率的な(しかし、この場合はおそらく不要な)アプローチは、このように、何かをnsIBinaryOutputStreamを使用して次のようになります。私は、この例でFileUtils moduleを使用しています

Components.utils.import("resource://gre/modules/FileUtils.jsm"); 

var stream = FileUtils.openSafeFileOutputStream(aFile, FileUtils.MODE_WRONLY | 
                 FileUtils.MODE_CREATE); 

var binaryStream = Components.classes["@mozilla.org/binaryoutputstream;1"] 
          .createInstance(Components.interfaces.nsIBinaryOutputStream); 
binaryStream.setOutputStream(stream); 
binaryStream.writeByteArray(data, data.length); 

FileUtils.closeSafeFileOutputStream(stream); 

、それがずっと簡単なものになります。

+0

最初の解決策が問題なく動作します。私は、何らかの変革が必要であることに感心しました。あなたの助けをありがとう、花の束が途中にあります! (私は実際に2番目のソリューションを最初に試しましたが、writeByteArrayに固執してしまいました。もう一度試してみます) – djnz0feh

関連する問題