file - Node isDirectory() 无法正常工作或者我丢失了一些东西

标签 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(something))时,它效果更好(更少错过)。这很奇怪。

最佳答案

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

由于 fs.stat() 函数调用是异步的,因此对 filestatus 数组的操作是重叠的。您应该使用 async 按照 elmigranto 建议使用库,或者改用 fs.statSync。

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

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

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

filestatus[z]=stats.isDirectory()

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

希望这是有道理的!

关于file - Node isDirectory() 无法正常工作或者我丢失了一些东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14337105/

相关文章:

sockets - 用于计时器操作的 React/Redux 和 Websockets

PHP file_get_contents() 和查询字符串

Python:如何创建唯一的文件名?

node.js - 将数据插入 MongoDB - 没有错误,没有插入

javascript - Node js 的 npm 操纵杆问题

javascript - 在函数内部创建的对象不起作用,但传入的对象可以

c - 套接字程序在接受时退出

python - 关闭没有 socket.close() 的 UDP 套接字

c++ - 内存映射文件 C++

file - Sublime Text 2 - 文件不会更新