如果你需要在指定文件夹中找出最大的文件(不包含子文件夹),用nodeJs如何做呢?
除了直接用回调调回调的方法外,还有很多优雅的方法来做这样的事情:
主程序的代码如下,简洁大方有内涵:
var findLargest = require('./findLargest'); findLargest('E:\\fakepath').then(function(filename){ console.log('largest file was: ', filename); }).catch(console.err);
关于Async大家可以看看这些链接的介绍
http://blog.fens.me/nodejs-async/
在网上流传着这么一段代码:
var fs = require('fs') var async = require('async') var path = require('path') module.exports = function (dir, cb) { async.waterfall([ function (next) { fs.readdir(dir, next) }, function (files, next) { var paths = files.map(function (file) { return path.join(dir,file) }) async.map(paths, fs.stat, function (er, stats) { next(er, files, stats) }) }, function (files, stats, next) { var largest = stats .filter(function (stat) { return stat.isFile() }) .reduce(function (prev, next) { if (prev.size > next.size) return prev return next }) next(null, files[stats.indexOf(largest)]) } ], cb) }
关于Promise的介绍,可以参考
http://www.tuicool.com/articles/AjaUjyJ于是乎,有了这样的代码
var fs = require('fs'); var path = require('path'); var Q = require('q'); var fs_readdir = Q.denodeify(fs.readdir) var fs_stat = Q.denodeify(fs.stat) module.exports = function (dir){ //使用Q来模拟promise return fs_readdir(dir) .then(function(files){ var promises = files.map(function(file){ return fs_stat(path.join(dir, file)); }); return Q.all(promises).then(function(stats){ return [files, stats]; }); }) .then(function(data){ var files = data[0]; var stats = data[1]; var largest = stats .filter(function(stat){return stat.isFile();}) .reduce(function(prev, next){ if(prev.size > next.size){ return prev; } return next; }); return files[stats.indexOf(largest)]; }); }
ES6的Promise
var fs = require('fs'); var path = require('path'); module.exports = function (dir){ return readDir(dir).then(getMaxStat); } //es6 promise function readDir(dir){ var readDirPromise = new Promise(function(resolve){ fs.readdir(dir, function(err, files){ if(err){ throw err; } resolve({dir: dir, files: files}); }); }); return readDirPromise; } function getMaxStat(param){ var promises = param.files.map(function (file){ var statPromise = new Promise(function(resolve){ fs.stat(path.join(param.dir, file), function (err, stat){ if(err){ return console.error(err); } resolve(stat); }); }); return statPromise; }); var maxStatPromise = new Promise(function(resolve){ Promise.all(promises).then(function(stats){ var maxStat = stats.reduce(function(prev, next){ if(prev.size > next.size) return prev; return next; }); resolve(param.files[stats.indexOf(maxStat)]); }); }); return maxStatPromise; }
除了系统包外,不依赖其他包,而且也做到了相对优雅,代码不够漂亮,还有进一步优化的空间,望各路高手轻拍