2011-07-31 73 views
2

我想建立一个Firefox扩展,我想定期在文件中写东西。所以我想要一个文件,在其中添加新的字符串。下面的代码写入文件,但最后文件只包含我写的最后一个字符串,而不包含前一个字符串。附加数据文件与Firefox扩展

你能帮我吗?

mydir=null; 
mylog=null; 
mystream=null; 

function initFolder() { 
var dirSvc = Components.classes["@mozilla.org/file/directory_service;1"] 
      .getService(Components.interfaces.nsIProperties); 
mydir = dirSvc.get("ProfD", Components.interfaces.nsILocalFile); 
mydir.append("mylogFolder"); 
if (!mydir.exists()) 
    mydir.create(mydir.DIRECTORY_TYPE, 0700); 

var fileName = "logFile.txt"; 
mylog = mydir.clone(); 
mylog.append(fileName); 
mylog.createUnique(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0777); 
} 

function mywriteFile(aData) { 
    // init stream 
    mystream = Components.classes["@mozilla.org/network/safe-file-output-stream;1"]. 
      createInstance(Components.interfaces.nsIFileOutputStream); 
    try { 
    mystream.init(mylog, 0x02 | 0x10, 0777, 0); //these flags to append file? 
    } catch (e) { 
    dump("exception: " + e + "\n"); 
    } 

    // convert to UTF-8 
    var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"]. 
       createInstance(Components.interfaces.nsIScriptableUnicodeConverter); 
    converter.charset = "UTF-8"; 
    var convertedData = converter.ConvertFromUnicode(aData); 
    convertedData += converter.Finish(); 
    try { 
    mystream.write(convertedData, convertedData.length); 
    } catch (e) { 
dump("exception: " + e + "\n"); 
    } 
} 

function close() { 
    if (mystream instanceof Components.interfaces.nsISafeOutputStream) { 
    mystream.finish(); 
    } else { 
    mystream.close(); 
    } 
} 

window.addEventListener("load", function(){ initFolder(); }, false); 
window.addEventListener("unload", function(){close(); }, false); 

有什么建议吗?

回答

3

“安全”文件输出流安全的原因是它将数据写入临时文件,并在您调用stream.finish()时将其复制到实际文件中。所以任何现有的数据都会丢失。如果你想追加,你必须使用一个不同的组件(普通的旧“@ mozilla.org/network/file-output-stream; 1”应该可以正常工作)。