Javascript 不要使用节点js读取3级之后的目录

Javascript 不要使用节点js读取3级之后的目录,javascript,node.js,async-await,promise,callback,Javascript,Node.js,Async Await,Promise,Callback,在特定的点或三级树结构之后,有没有办法停止读取目录 比如说 MainFolder -ABC Folder -DEF Folder -GHI Folder -image.png -jkl.gif 当我点击ABC文件夹时,我的路径将如下所示 如果其中有任何其他文件夹或文件,则看起来 /MainFolder/ABC Folder -PQR Folder -STU Folder -abc.pdf -xyz.txt 单击PQR文件夹,然后它将如下所示 /MainFolder/ABC Folder/PQ

在特定的点或三级树结构之后,有没有办法停止读取目录

比如说

MainFolder
-ABC Folder
-DEF Folder
-GHI Folder
-image.png
-jkl.gif
当我点击ABC文件夹时,我的路径将如下所示 如果其中有任何其他文件夹或文件,则看起来

/MainFolder/ABC Folder
-PQR Folder
-STU Folder
-abc.pdf
-xyz.txt
单击PQR文件夹,然后它将如下所示

/MainFolder/ABC Folder/PQR Folder
-DFC Folder
-HKJ Folder
-mnb.pdf
-xyz.txt
但不应读取DFC文件夹/HKJ文件夹或在三级树结构之后出现的任何其他文件夹 输出:-

["MainFolder/image.png",
"MainFolder/jkl.gif",
"MainFolder/ABC Folder/abc.pdf",
"MainFolder/ABC Folder/xyz.txt",
"MainFolder/ABC Folder/PQR Folder/mnb.pdf",
"MainFolder/ABC Folder/PQR Folder/xyz.txt"]
代码,我让它读取所有文件和子目录,但我想停止在3级目录

async function getAllFile(folderPath) {
  let files = await fs.readdir(folderPath);
  files = await Promise.all(
    files.map(async (file) => {
      const filePath = path.join(folderPath, file);
      const stats = await fs.stat(filePath);
      if (stats.isDirectory()) {
        return getAllFile(filePath);
      } else if (stats.isFile()) return filePath;
    })
  );

  return files.reduce((all, folderContents) => all.concat(folderContents), []);
}

PS:使用节点10.16.3应该可以解决您的问题。我添加了depth参数,它基本上表示要遍历多少文件夹级别。在文件树的情况下,您可以使用深度2调用此函数:
getAllFile('./MainFolder/',2)
,因为您希望浏览根目录(级别1)和子文件夹(级别2),而不是子文件夹(级别3)中的文件夹

如果一个文件夹仍然未被探测,我也会返回null,否则会导致
未定义的值。在返回之前,我过滤掉这些
null

async function getAllFile(folderPath, depth) {
  depth -= 1;
  let files = await fs.readdir(folderPath);
  files = await Promise.all(
    files.map(async (file) => {
      const filePath = path.join(folderPath, file);
      const stats = await fs.stat(filePath);
      if (stats.isDirectory() && depth > 0) {
        return getAllFile(filePath, depth);
      } else if (stats.isFile()) return filePath;
      else return null;
    })
  );
  return files.reduce((all, folderContents) => all.concat(folderContents), []).filter(e => e != null);
}

它不工作@fravolt仍在读取所有文件夹根不计入深度。深度(例如)0不应返回子文件夹的内容,而深度1应返回子文件夹,但不返回子文件夹。我更新了我的原始答案,并加入了我能理解的代码run@fravolt“请注意,对于我来说,fs.readdir和fs.stat函数不会返回,但需要一个回调函数,但这可能是我这边的版本不匹配(我在节点V12.18.3上)。”-您可以使用
require('fs')).promissions
在节点v12上获得对
fs
方法的许可版本的访问权。@fravolt我尝试了你的代码,但仍然获得了目录,但感谢你的帮助:-)@Aakash我刚刚提出了一个新的更好的解决方案。我自己用你的文件夹结构测试了这个,它看起来像预期的那样工作。请让我知道它是否有效!:D