2012-02-16 29 views
1

嗨:我正在寫一個firefox擴展(我的第一個),其中,獲取圖像url讀入一個字節數組,然後寫出該二進制信息到文件。我已經使用this example,看起來好像它可以工作,但是文件不正確,就好像它已經執行了某種字符轉換。從JavaScript(火狐插件)寫入二進制數據

我的版本如下:

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."); 
} 

我知道數據緩衝區本身是印刷出來的前幾個字節確定,但該文件是完全不同的,一旦在磁盤上。任何想法或任何其他方式寫出二進制文件?

我知道這是一個同步寫入,但文件很小,(20Kb)...但這是唯一的例子。如果我能解決這個問題,我已經完成了擴展!任何和所有幫助表示讚賞。

回答

2

你在這裏的代碼工作正常 - 例如,它如果data"foo\0\n\rbar"該字符串正確寫入磁盤。也許問題是nsIOutputStream.write()需要一個字符串作爲參數,但是你正在談論一個字節數組。如果您data變量確實是一個字節數組,那麼也許這是最簡單的將其轉換成字符串第一:

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

該操作data之後是對應於原始字節數組的字符串,可與nsIOutputStream.write()使用。更高效的(但可能是在這種情況下不必要的)方法是使用nsIBinaryOutputStream,這樣的事情:

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); 

我在這個例子中使用FileUtils module,它使事情變得簡單許多。

+0

您的第一個解決方案正常工作。我有一種預感,需要進行某種轉變。非常感謝你的幫助,一束鮮花正在進行中! (我確實先嚐試了第二種解決方案,但它被卡在了writeByteArray上,我會再試一次。) – djnz0feh 2012-02-17 11:18:00