我想从路径获取文件和目录的所有名称,并将它们识别为文件和目录。但是,当我运行我的代码时,它有时会工作,而且有些东西显示目录是文件。这是代码
socket.on('data',function(path){
fs.readdir('path',function(err, data) {
var filestatus=[];
var z=0;
var i=data.length-1;
data.forEach(function(file){
fs.stat(file, function(err, stats) {
filestatus[z]=stats.isDirectory()
if (z==i){
socket.emit('backinfo',{names:data,status:filestatus});
}
z++;
})
})
})
})
在测试期间,我意识到当我减慢data.forEach循环时(使用console.log(某些东西)它会更好地工作(减少错过)。这很奇怪。
答案 0 :(得分:1)
大约96%不正确,感谢JohnnyHK指出我的错误,请参阅下面的评论,了解真正的问题/解决方案。
因为fs.stat()函数调用是异步的,所以filestatus数组上的操作是重叠的。您应该使用 async 库作为elmigranto建议,或者切换到使用fs.statSync。
有关正在发生的事情的更多细节:
当你调用fs.stat()时,它基本上在后台运行,然后立即进入下一行代码。当它获得文件的详细信息后,它会调用回调函数,该函数在您的代码中是将信息添加到filestatus数组的函数。
因为fs.stat()在返回之前没有等待,所以你的程序很快就会通过数据数组,并且同时运行多个回调并导致问题因为z变量没有立即增加,所以
filestatus[z]=stats.isDirectory()
在z增加之前,可以通过不同的回调执行多次。
希望有意义!
答案 1 :(得分:0)
您在NODEJS中使用for语句,如果将For语句转换为递归函数,这将起作用请参阅附带的代码以获取帮助
function load_Files(pat,callback) {
console.log("Searching Path is: "+ph);
fs.readdir(pat,(err,files)=>
{
if(err)
{
callback(err);
}
else
{
var onlydir=[];
var onlyfiles=[];
var d=(index)=>
{
if (index==files.length)
{
console.log("last index: "+ index);
var ar=[];
ar.concat(onlydir,onlyfiles);
callback(null,ar);
return;
}
fs.stat(files[index],(err,status)=>
{
console.log("the needed file " +files[index]);
if (status.isDirectory())
{
onlydir.push(files[index]);
}
else
{
onlyfiles.push(files[index]);
}
console.log("only Directory: "+onlydir.length);
console.log("index: "+ index);
d(index+1);
}
)
}
d(0);
}
});
}