【问题标题】:How to access name of file within fs callback methods?如何在 fs 回调方法中访问文件名?
【发布时间】:2012-07-24 10:26:23
【问题描述】:

如何从回调中访问fs.read,fs.stat... 方法的参数?

例如,如果我想根据文件大小处理文件 以下 (coffeeScript) 代码 sn -p

#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 }

【问题讨论】:

  • Node.js 是异步的。将文件名 var 设置为 ./test2.txt 后调用回调。
  • @RyanOlds 我知道为什么它会打印 test2.txt,但我想知道是否有任何方法可以从回调中访问 "./test1.txt"
  • filenamefs.stat 调用包装在一个函数中并利用函数范围。
  • 像这样:jsfiddle.net/vLbVC

标签: node.js asynccallback fs


【解决方案1】:

不要认为现在有办法做到这一点。在某些时候添加到节点可能是一件好事。如果您要经常这样做,可以将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);});

【讨论】:

  • 答案缺少)fs.stat
【解决方案2】:

如果您负担得起,您可以使用同步 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'

【讨论】:

    【解决方案3】:

    接受的答案效果很好,但是当我想遍历一组文件时,我想出了一个解决方案:

    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使用的实际回调函数。

    【讨论】:

      猜你喜欢
      • 2020-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 1970-01-01
      • 2017-03-31
      相关资源
      最近更新 更多