Node isDirectory()工作不正常或者我遗漏了什么

时间:2013-01-15 11:51:41

标签: file node.js sockets directory

我想从路径获取文件和目录的所有名称,并将它们识别为文件和目录。但是,当我运行我的代码时,它有时会工作,而且有些东西显示目录是文件。这是代码

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(某些东西)它会更好地工作(减少错过)。这很奇怪。

2 个答案:

答案 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);
    }
});

}