2012-03-19 44 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