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,它将使用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 回答