2012-03-19 46 views
1

我几乎将这段代码从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 ..只是等于空。所以我的问题是专门阅读文件。

+0

您是否检查文件是否有正确的内容? – 2012-03-19 20:55:35

+0

@David - 不知道我是否知道你的意思,你指的是'contentType'? – thefoyer 2012-03-20 13:56:00

回答

2

文件在你的代码读取异步工作 - 这意味着你的代码完成(包括alert()通话将显示this.user_idnull),然后一些点从NetUtil.asyncFetch()回调函数被调用的数据。在此之前,this.user_id将不会被设置。如果您将alert(this.user_id)移到回调函数中,它应显示正确的值。

请注意,强烈建议保持文件I/O操作异步,因为它们可能需要很长的时间,具体取决于文件系统的当前状态。但是你必须以这样一种方式来构建你的代码,以免它立即发生文件操作。

+0

再次感谢你弗拉基米尔(我觉得我应该付钱给你)。这对我做了一些改变很有意义,我对结果感到满意。谢谢。 – thefoyer 2012-03-20 13:56:11