2011-04-27 89 views
1

我想開發一個Firefox擴展。 剛開始時我試圖寫入文件,但我得到這個非常奇怪和莫名其妙的行爲。在Mozilla Firefox擴展中寫入文件 - 奇怪的錯誤

此代碼的工作:

var file = showFilePicker(window,"saveTestCaseAs", 
            Components.interfaces.nsIFilePicker.modeSave, 
            Format.TEST_CASE_DIRECTORY_PREF, 
           function(fp) {return fp.file;}); 

var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); 
foStream.init(file1, 0x02 | 0x08 | 0x20, 438, 0); 

var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"]. 
        createInstance(Components.interfaces.nsIConverterOutputStream); 

converter.init(foStream, "UTF-8", 0, 0); 

converter.writeString("test string"); 

converter.close(); 

和這一個不:

var file1 = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile); 
file1.initWithPath("C:\Documents and Settings\XPMUser\Desktop\test.t"); 

var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].createInstance(Components.interfaces.nsIFileOutputStream); 
// use 0x02 | 0x10 to open file for appending. 
foStream.init(file1, 0x02 | 0x08 | 0x20, 438, 0); 
var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"]. 
       createInstance(Components.interfaces.nsIConverterOutputStream); 
converter.init(foStream, "UTF-8", 0, 0); 
converter.writeString("test string"); 
converter.close(); // this closes foStream 

錯誤信息是: 錯誤:組件返回失敗代碼:0x80004005的(NS_ERROR_FAILURE)[nsIFileOutputStream.init] 但是,這個錯誤信息並不意味着什麼,因爲這是所有的最通用的錯誤。 這是非常奇怪的,因爲唯一的區別是文件對象是未知的,但是在兩種方式中,初始化參數(文件名,前綴等)和返回的對象類型完全相同。

如果有人提供一些線索,這將是非常gratefull。

+0

請注意,您確實不應該在您的加載項中執行同步磁盤I/O。 https://developer.mozilla.org/en/Code_snippets/File_I%2f%2fO#Write_a_string向您展示瞭如何以更高效的方式實現這一點。 – sdwilsh 2011-04-27 17:29:10

回答

1

@sdwilsh在上面寫得非常好。這個問題非常簡單,事件愚蠢。這是在單反斜槓和一般的錯誤信息。 我提供的路徑是單反斜線,它們被解釋爲轉義符號,實際上字符串不再是有效的路徑。用'\'代替'\'解決了這個問題。 所以這是非常簡單的問題,但真的應該更多地關注細節。