读取目录下的所有文件,不要求递归子目录下的文件。本文主要分析Nodejs中的同步和异步问题。
下面的代码能得到结果吗?
var path = require("path");
var fs = require("fs");
var dirs = [];
var pathName = "E:/test";
fs.readdir(pathName, function(err, files){
for (var i=0; i<files.length; i++)
{
fs.stat(path.join(pathName, files[i]), function(err, data){
if(data.isFile())
{
dirs.push(files[i]);
}
});
}
console.log(dirs);
});
执行代码,输出结果:
[]
输出了空数组,为什么?
首先牢记nodejs单线程,非阻塞的特点。fs.readdir()和fs.stat()都是异步执行。console.log()执行时,可能fs.stat()的回调函数尚未执行完毕,所以输出了空数组。
修改上述代码,改异步为同步,可以得到想要结果。
var path = require("path");
var fs = require("fs");
var pathName = "E:/test";
fs.readdir(pathName, function(err, files){
var dirs = [];
(function iterator(i){
if(i == files.length) {
console.log(dirs);
return ;
}
fs.stat(path.join(pathName, files[i]), function(err, data){
if(data.isFile()){
dirs.push(files[i]);
}
iterator(i+1);
});
})(0);
});
执行代码,输出结果:
[ 'project.txt', 'text.txt' ]