我想从path中获得所有文件和目录的名称,并将它们识别为文件和目录。但是当我运行我的代码时,有时它会工作,有时它显示目录是文件。下面是代码
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++;
})
})
})
})
在测试期间,当我放慢数据时,我意识到这一点。forEach循环(使用console.log之类的东西)效果更好(更少丢失)。这很奇怪
这大约有96%的错误,感谢JohnnyHK指出我的错误,真正的问题/解决方案请看下面的评论
因为fs.stat()函数调用是异步的,所以对filestatus数组的操作是重叠的。您应该像elmigrto建议的那样使用async库,或者切换到使用fs.statSync。
关于正在发生的事情的更多细节:
当您调用fs.stat()时,它基本上在后台运行,然后立即进入下一行代码。当它获得文件的详细信息后,它调用回调函数,在代码中,该函数是将信息添加到filestatus数组的函数。
因为fs.stat()在返回之前没有等待,所以您的程序正在快速遍历数据数组,并且同时运行多个回调,并且由于z变量没有立即递增而导致问题,因此
filestatus[z]=stats.isDirectory()
可以被不同的回调函数执行多次,直到z被增加。
希望这是有意义的!
你在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);
}
});
}