我几乎从MDN File I/O页面复制了这段代码..除了我添加了一个if语句来检查文件是否已经存在,如果已存在,请改为阅读。
Components.utils.import("resource://gre/modules/NetUtil.jsm");
Components.utils.import("resource://gre/modules/FileUtils.jsm");
var file = Components.classes["@mozilla.org/file/directory_service;1"].
getService(Components.interfaces.nsIProperties).
get("Desk", Components.interfaces.nsIFile);
file.append("test.txt");
if (!file.exists()) {
this.user_id = Math.floor(Math.random()*10001) +'-'+ Math.floor(Math.random()*10001) +'-'+ Math.floor(Math.random()*10001) +'-'+ Math.floor(Math.random()*10001);
var ostream = FileUtils.openSafeFileOutputStream(file)
var converter = Components.classes["@mozilla.org/intl/scriptableunicodeconverter"].
createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
converter.charset = "UTF-8";
var istream = converter.convertToInputStream(this.user_id);
// The last argument (the callback) is optional.
NetUtil.asyncCopy(istream, ostream, function(status) {
if (!Components.isSuccessCode(status)) {
alert('Error '+ status);
return;
}
alert('File created');
});
} else
{
NetUtil.asyncFetch(file, function(inputStream, status) {
if (!Components.isSuccessCode(status)) {
alert('error '+ status);
return;
}
// The file data is contained within inputStream.
// You can read it into a string with
this.user_id = NetUtil.readInputStreamToString(inputStream, inputStream.available());
});
alert('File exists already, do not create');
}
alert(this.user_id);
它创建文件就好了,我可以打开它并阅读它。但是,如果该文件已存在,则不会填充this.user_id
..只等于null。所以我的问题是专门阅读文件。
答案 0 :(得分:2)
您的代码中的文件读取异步工作 - 意味着您的代码完成(包括alert()
调用,这将显示this.user_id
是null
),然后在某些时候,来自NetUtil.asyncFetch()
的回调被数据调用。在此之前,this.user_id
将不会被设定。如果将alert(this.user_id)
移动到回调函数中,则应显示正确的值。
请注意,强烈建议保持文件I / O操作的异步,因为它们可能需要很长时间,具体取决于文件系统的当前状态。但是你必须以不假设文件操作立即发生的方式构造你的代码。