2011-04-27 74 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在上面写得非常好。这个问题非常简单,事件愚蠢。这是在单反斜杠和一般的错误信息。 我提供的路径是单反斜线,它们被解释为转义符号,实际上字符串不再是有效的路径。用'\'代替'\'解决了这个问题。 所以这是非常简单的问题,但真的应该更多地关注细节。