我试图遍历一堆目录,然后尝试使用NodeJS和fs.stat()存在该目录中的文件。
我有一个简单的for循环遍历目录,并在其中调用fs.stat()来检查,如果" project.xml"在该特定目录中存在。我的代码如下所示:
for (var i = 0, length = prDirs.length; i < length; i++) {
var path = Config["ProjectDirectory"] + "/" + prDirs[i];
console.log("PATH=" + path);
fs.stat(path + "/project.xml", function (err, stat) {
if (err == null) {
console.log(" => PATH=" + path);
}
})
}
NodeJS在目录上正确循环,console.log()
正确输出所有目录,但是ifs fs.stat()里面的代码没有被调用,只在循环结束时运行一次。我的控制台显示了这个:
PATH=(...)/PHP
PATH=(...)/Electron
PATH=(...)/testapp
PATH=(...)/Vala
=> PATH=(...)/Vala/project.xml
但我正在寻找的project.xml位于testapp/
的{{1}} 而非,但Vala/
是{{1}中的最后一个条目}}
上面的代码是我最近的尝试,我尝试了很多其他变体,其中一个(我在Vala/
prDirs
内附加了else
)向我展示了if
实际获取,但只有fs.stat()
内的代码没有运行,fs.stat()
我添加一次后的代码跑步。
提前致谢!
答案 0 :(得分:0)
fs.stat
是一个异步i / o函数,因此只有在主线程空闲后才会调用它的回调,或者只在for
循环完成后调用它。而不是for
循环,我建议在异步事件中迭代文件夹。您可以使用async_read_until()
,async.each
或自行实施。
答案 1 :(得分:0)
@Gil Z在异步中提到fs.stat
。如果你想为每个循环保留并使代码看起来同步,我建议使用promises
。
这是一个例子。适用于节点v 6.9
"use strict";
const fs = require('fs');
let paths = ["tasks", "aaa", "bbbb"];
//method to get stat data using promises
function checkFileExists(path) {
return new Promise((resolve, reject) => {
fs.stat(path + "/project.xml", (err, res) => {
resolve(err ? "Not found in " + path : " => PATH=" + path);
});
});
}
//create promise array with each directory
let promiseArr = [];
paths.forEach(pathPart => {
let path = process.cwd() + "/" + pathPart;
promiseArr.push(checkFileExists(path));
});
//run all promises and collect results
Promise.all(promiseArr)
.then(reslut => {
console.log(reslut);
})
.catch(e => console.log("Error in promises"));
以上代码将记录此
[ ' => PATH=/Users/mykolaborysiuk/Sites/circlemedia/syndic-apiManager/tasks',
'Not found in /Users/mykolaborysiuk/Sites/circlemedia/syndic-apiManager/aaa',
'Not found in /Users/mykolaborysiuk/Sites/circlemedia/syndic-apiManager/bbbb' ]
希望这有帮助。