节点isDirectory()不能正常工作,或者我缺少了一些东西



我想从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);
    }
});

}

相关内容

  • 没有找到相关文章

最新更新