2012-03-19 5 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 ..の値はnullに等しくなりません。だから私の問題は、特にファイルを読むことです。あなたのコードが完了したことを意味NetUtil.asyncFetch()からのコールバックにデータが呼び出されますいくつかの点で、その後、alert()this.user_idnullであることが表示されますコールを含む) - あなたのコードを読み込む

+0

ファイルの内容が正しいかどうか確認しましたか? –

+0

@David - あなたが 'contentType'を参照していることを私が知っているかどうかわからないのですか? – thefoyer

答えて

2

ファイルが非同期で動作します。それが起こるまでthis.user_idはもちろん設定されません。 alert(this.user_id)をコールバック関数に移動すると、正しい値が表示されます。

ファイルI/O操作は、ファイルシステムの現在の状態によっては時間がかかるため、非同期にすることを強くお勧めします。しかし、ファイル操作がすぐに起こるとは想定しないようにコードを構造化する必要があります。

+0

もう一度ありがとうウラジミール(私はあなたに支払うべきであるように感じる)。これは私がいくつかの変更を加えたことを意味し、結果に満足しています。ありがとう。 – thefoyer

関連する問題