2012-10-29 12 views
6

私はファイルパラメータを読み込もうとしています。nodejsでのfs.statの使用に関する問題

var fs = require('fs'), 
    size = new Object(); 
fs.stat(file, function(err,stats){ 
     if(!err){ 
      size=stats; 
     } 
     }) 
    console.log(size); 

それは `s私が使用して機能をしようとしたとき、[OK]、::

var fs = require('fs'), 
    size = new Object(); 
function writeinfile(file){ 
    fs.stat(file, function(err,stats){ 
     if(!err){ 
      size=stats; 
     } 
     }) 
    console.log(size.size); 
} 
writeinfile('error.log'); 

それは` sが動作しない、私はこのコードを作るとき。私は変種2の仕事を手伝ってもらえますか?

答えて

0

あなたのコードにいくつかの観察があります。しかし、我々は学ぶためにここにいる:関数がそのタスクを実行した後

  1. は、コールバックの内側console.log(すなわち真下size=stats)、あなたが必要な情報を得ることができる方法を入れていることを確認してください。

  2. if (!err)の上にこの行を追加します。

    (ERR)はconsole.log(ERR)場合。

あなたは、パス上のエラーを意味し、次の

{ [Error: ENOENT, stat 'error.log'] errno: 34, code: 'ENOENT', path: 'error.log' } 

が表示されます。簡単な修正:fs.exists()を使用してファイルが存在するかどうかを確認し、ファイル名の前に必ず__dirnameを付けてください。

  1. 最後の行を約writeinfileを語ったが、fs.statsは、私はより良い機能は、このタスクのfs.write()だろうことを示唆している...あなたのファイルに関する情報を提供します。
+0

ファイルに情報を書き込もうとしていて、ファイルサイズが所望のサイズ(fs.rename)に達したときにファイルの名前を変更し、新しいファイルに情報を書き込みます。変数 "size"でファイルのサイズを取得する予定です.fs.statを使用し、if(size <= 238084)(fs.rename(...))else fs.write(....)を使用します。 – IIEIIEJI

12

あなたのconsole.logはfs.statコールバックの外にあります。それを修正:ハーマンは彼の答えで述べたように、それは良いでしょう

var fs = require('fs'); 

function writeinfile (file, cb) { 
    fs.stat(file, function(err,stats){ 
    if(err) return cb(err); 
    cb(null, stats.size); 
    }) 
} 

writeinfile('error.log', function(err, size) { 
    if(err) { 
    console.log(err); 
    return; 
    } 
    console.log('The size of the file is ' + size); 
}); 

var fs = require('fs'), 
    size = new Object(); 
function writeinfile(file){ 
    fs.stat(file, function(err,stats){ 
     if(!err){ 
      size=stats; 
      console.log(size.size); 
     } 
     }) 

} 
writeinfile('error.log'); 

私はまた、Node.jsの中に多くの慣用的な(より一般的な)構文を使用するようにコードを書き換えましたあなたがファイルに書き込んでいない場合、より良い関数名を選択するというアイデア。

最後に、をnew Object()のショートカットとして使用できます。たとえば、var size = {};

1

この例では、fs.stat()の非同期性のためにconsole.log(size)が実行されたときに、sizeの値が設定されることを期待するのは間違いです。ここで

は、実際の順序で、何が起こるかです:

  1. あなたがfsモジュールを必要とし、新しいsizeオブジェクトをインスタンス化します。
  2. あなたがにconsole.logを呼び出すコールバック
  3. で(パス、CB)fs.statを呼び出し(サイズ)
  4. そして、将来のある時点で、FS。stat()があなたのコールバックを呼び出す

ファイルioの非同期性のために、必要なファイルシステムコールを実行するのに必要な時間があらかじめ予測できないため、このようなことが起こります。ディスクが現在何をしているかに応じて、4〜4000msまたはそれ以上の時間がかかります。

これは、コールバックが適用されたときに発生することが保証されているため、またはこの場合はファイルパスのステータスが決定されたときに発生することが保証されているためです。

そして、気分を悪くしないでください。これは1つのミスです誰もがを非同期でプログラミングすると、ノードをプログラミングするときに頭を包むのが最も難しいコンセプトです。

+0

+1最初のコールバックはすごくうんざりでした! –

1

console.log(size.size)を入れる必要があります。コールバック関数の中で、私はより良い説明が必要だと思います。

非同期呼び出しとNode.jsイベントループについて知る必要があります。 Node.jsは、CPU集中型よりもIO集中型(Webサーバーなど)の問題用のスレッドを作成するためのより良い方法でリソースをパラレル化するために作成されました。アイデアは、IOを使用するためのブロックされていない呼び出しを持つロジックのための単一のスレッドは、複数のスレッドを作成し、コールブロックがIOを使用するように機能するよりも優れているということです。

あなたが別の言語でプログラミングする場合は、あなたのアルゴリズムのsinchronousバージョンに精通している必要があります。

var fs = require('fs'), 
size = new Object(); 
function writeinfile(file) { 
    var stats = fs.statSync(path); 
    size = stats.size; 
    console.log(size); 
}; 

writeinfile('error.log'); 

これはNode.jsのコードですが、これはノードの方法ではありません。 statSync()を呼び出すと、スクリプトブロックがディスクから統計情報を読み込むのを待機します。

ただし、ちょうどfs.stat()を使用すると、プログラムはコードの最後まで実行されます。ディスクが読み込み中です。すべての次の行は、プログラムがイベントループを達成する前に実行されます。 statが準備完了し、プログラムが最後まで実行されると、イベントループは引数で渡すコールバック関数をfs.stat(callback)呼び出しで呼び出します。

したがって、あなたのコードでは、stat(アシンクロナスバージョン)を呼び出して、まだ準備されていない値を使用してください。コールバックを呼び出す前に必ずアシンクロナスコールの後のコードが実行されるからです。

最初のバージョンでは、インタープリタでコードを手動でタップする必要があるため、次の行を入力する必要がある時間は、イベントループを達成するのに十分な時間です。このモードでは、コマンドを入力するたびにEnterキーを押し、そのコードが実行されます。つまり、戻り値を取得すると、イベントループ内のイベントが後に呼び出されます。

関連する問題