Javascript 在stat方法之前检查权限以避免错误

Javascript 在stat方法之前检查权限以避免错误,javascript,node.js,fs,traversal,tree-traversal,Javascript,Node.js,Fs,Traversal,Tree Traversal,我第一次尝试遍历目录,但是stat对一些目录抛出错误,这似乎是由于缺乏权限 错误:EPERM:不允许操作,统计“K:\System Volume Information” 如果给定的目录将抛出错误,我希望首先避免调用stat,但我不知道如何执行 我尝试过完全忽略受保护的目录。然而,我遇到的所有问题都使用了正则表达式——就我对MacOS、Linux以及如何在Windows环境下处理事情的有限知识而言——似乎并不适用于Windows环境 在调用stat之前,我尝试检查目录的读写权限,但这似乎没有任何

我第一次尝试遍历目录,但是
stat
对一些目录抛出错误,这似乎是由于缺乏权限

错误:EPERM:不允许操作,统计“K:\System Volume Information”

如果给定的目录将抛出错误,我希望首先避免调用
stat
,但我不知道如何执行

我尝试过完全忽略受保护的目录。然而,我遇到的所有问题都使用了正则表达式——就我对MacOS、Linux以及如何在Windows环境下处理事情的有限知识而言——似乎并不适用于Windows环境

在调用
stat
之前,我尝试检查目录的读写权限,但这似乎没有任何作用

async function scanDirs(){
  const
    r = await fsp.readFile('./config.json', 'utf8'),
    archives = JSON.parse(r).archives,
    fs = require('fs'),
    { join } = require('path'),
    traverse = async (dir) => {
      try {
        const perm = await fsp.access(dir, fs.constants.R_OK)
        if (perm === undefined){
          const stats = await fsp.stat(dir)
          if (stats.isDirectory()){
            const subfolders = await fsp.readdir(dir)
            subfolders.forEach(path => {
              const fullPath = join(dir, path)
              traverse( fullPath )
            })
          }
        }
      }
      catch (error){
        console.error(error)
      }
    }

  for (const dir of archives){
    traverse(dir)
  }
}
在将给定文件夹的子文件夹返回到
遍历
之前,我还尝试检查它们的权限,但这也不起作用

            for (const path of subfolders){
              const
                fullPath = join(dir, path),
                perm = await fsp.access(fullPath, fs.constants.R_OK)
              if (perm === undefined) traverse(fullPath)
            }

任何帮助都将不胜感激。

在执行异步操作之前尝试检查内容通常会受到竞争条件的影响(例如,这就是为什么不推荐使用
fs.exists()
)。通常,最好只是尝试该操作并正确处理您遇到的任何错误。您是否有理由害怕尝试该操作并正确处理错误?加上,您无法预先测试所有可能的错误,因此您必须处理主要操作中的错误。然后,处理错误就变成了一项任务,以决定哪些错误应该跳过并继续其他处理,哪些错误是致命的,操作应该中止。@jfriend00我相信代码不会引入任何竞争情况因为正在使用
wait
?我想要避免的一个错误仅仅是权限错误。有两种方法可以做到这一点:(1)在做任何其他事情之前检查权限,因为某些原因,这似乎不起作用;或者(2)以某种方式确认,以避免查询隐藏的驱动器和文件,我甚至不确定可以这样做。我知道
exists
已被弃用,但文档建议使用
access
stat
这就是我所做的?@jfriend00我的意思是我可以忽略捕获到的错误,但如果我能避免首先抛出这些错误的代码,这样它们就不会分散我对其他可能错误的注意力,那就是ideal@PrimitiveNom存在争用条件是因为其他程序可能会在应用程序遍历目录时更改权限。在
access
调用和
stat
调用之间,权限可能会发生变化。