5

fs.readコールバック内から、fs.stat...メソッドの引数にアクセスするにはどうすればよいですか?

たとえば、次の(coffeeScript)コードスニペットのサイズに基づいてファイルを処理する場合

#assuming test1.txt exists
filename = "./test1.txt"
fs.stat filename, (err, stats) ->
  data = filename:filename,size:stats.size
  console.log data
  #further process filename based on size
filename = "./test2.txt"

プリント

{ filename: './test2.txt', size: 5 }

ファイル名が「./test2.txt」に設定されているため。fs.statコールバック内でfilename変数を使用してファイルを処理/読み取る場合、 test2.txt意図されていないものが使用されます。

コールバック内に表示されると予想されるのは

{ filename: './test1.txt', size: 5 }
4

3 に答える 3

7

今これを行う方法があるとは思わないでください。ある時点でノードに追加するのは良いことかもしれません。あなたがこれをたくさんするつもりなら、あなたはfs.stat友好的なラッパーに入れることができます。

var friendlyStat = function(filename, callback){
    fs.stat(filename, function(err, stats){
        stats.filename = filename

        if(err) {
            callback(err);
        } else {
            callback(err, stats);
        }
    })
}

friendlyStat('test1.txt', function(err, stat){ console.log(stat.filename);});
friendlyStat('test2.txt', function(err, stat){ console.log(stat.filename);});
于 2012-07-25T22:38:04.197 に答える
1

fs.statSync()余裕があれば同期機能を使用できます。これは問題の解決に役立ちます。

var filename = 'test1.txt';
var stat = fs.statSync(filename);
//code you were writing in callback comes here like the below:
console.log('Is ' + filename + ' a directory? ' + stat.isDirectory());
//Outputs 'Is test1.txt a directory? false'
于 2017-05-02T17:11:00.017 に答える
0

受け入れられた答えはうまく機能しますが、ファイルの配列をループしたいときに思いついた解決策は次のとおりです。

var files = [ 'path/to/file1.txt', 'path/to/file2.txt'],
    callback = function( filepath ) {
        return function( error, stat ) {
            console.log( filepath );
            console.log( error );
            console.log( stat )
        };
    };

    for ( var i = 0; i < files.length; i++ ) {
        fs.stat( files[ i ], callback( files[ i ] ) );
    }

関数を呼び出してcallback、引数としてファイル名を渡します。次に、この関数は、によって使用される実際のコールバック関数を返しますfs.stat

于 2016-09-12T17:16:24.500 に答える