1

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

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(something) 它工作得更好(更少错过)。这很奇怪。

4

2 回答 2

1

这大约有 96% 不正确,感谢 JohnnyHK 指出我的错误,请参阅下面的评论了解真正的问题/解决方案。

因为 fs.stat() 函数调用是异步的,所以对 filestatus 数组的操作是重叠的。您应该按照 elmigranto 的建议使用异步库,或者切换到使用 fs.statSync。

有关正在发生的事情的更多详细信息:

当您调用 fs.stat() 时,它基本上在后台运行,然后立即进入下一行代码。当它获得文件的详细信息后,它会调用回调函数,在您的代码中,该函数是您将信息添加到 filestatus 数组的函数。

因为 fs.stat() 在返回之前没有等待,所以您的程序正在非常快速地遍历数据数组,并且同时运行多个回调并导致问题,因为 z 变量没有立即递增,所以

filestatus[z]=stats.isDirectory()

在 z 增加之前,可以由不同的回调多次执行。

希望这是有道理的!

于 2013-01-15T12:37:56.680 回答
0

you are using for statement in NODEJS and this will work if turned the For Statement to recursive function please see the attached code for help


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

}

于 2017-03-12T17:41:48.037 回答