如何在fs回调方法中访问文件名?

时间:2012-07-25 21:40:45

标签: node.js asynccallback fs

如何从回调中访问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 }

as filename设置为“./test2.txt”。如果我使用fs.stat回调中的文件名变量处理/读取文件,则会使用test2.txt,这不是预期的。

我希望在回调中看到的是

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

3 个答案:

答案 0 :(得分: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);});

答案 1 :(得分: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'

答案 2 :(得分: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使用的实际回调函数。