Javascript 使用nodejs递归获取目录中的所有目录

Javascript 使用nodejs递归获取目录中的所有目录,javascript,node.js,recursion,directory,path,Javascript,Node.js,Recursion,Directory,Path,我想让给定目录中的所有目录同步 <MyFolder> |- Folder1 |- Folder11 |- Folder12 |- Folder2 |- File1.txt |- File2.txt |- Folder3 |- Folder31 |- Folder32 这是我的代码: const fs = require('fs'); const path = require('pat

我想让给定目录中的所有目录同步

<MyFolder>
    |- Folder1
       |- Folder11
       |- Folder12
    |- Folder2
    |- File1.txt
    |- File2.txt
    |- Folder3
        |- Folder31
        |- Folder32
这是我的代码:

const fs = require('fs');
const path = require('path');

function flatten(lists) {
  return lists.reduce((a, b) => a.concat(b), []);
}

function getDirectories(srcpath) {
  return fs.readdirSync(srcpath)
  .map(file => path.join(srcpath, file))
  .filter(path => fs.statSync(path).isDirectory());
}

function getDirectoriesRecursive(srcpath) {
  return [srcpath, ...flatten(getDirectories(srcpath).map(getDirectoriesRecursive))];
}

有人能帮我解决上面的问题吗?

你就快到了,你只需要避免
文件(不是目录),这样
getDirectoriesRecursive(srcpath)
函数递归就不会抛出错误

这是最终的
getdirectoriescursive
代码:

function getDirectoriesRecursive(srcpath) {
  return [srcpath, ...flatten(getDirectories(srcpath).map((p) => {
    try {
      if (fs.existsSync(path)) {
        if (fs.lstatSync(path).isDirectory()) {
          return getDirectoriesRecursive(path);
        }
      }
    } catch (err) {
      console.error(err)
    }
  }).filter(p => p !== undefined))];
}
这是为了显示
“/opt”

async

这是一个高度优化的版本,使用节点的快速对象。这种方法允许您跳过每个路径上昂贵的
fs.existsSync
fs.statSync
调用-

const { readdir } =
  require ("fs/promises")

const { join } =
  require ("path")

const dirs = async (path = ".") =>
  Promise.all
    ( (await readdir (path, { withFileTypes: true }))
        .map
          ( dirent =>
              dirent .isDirectory ()
                ? dirs (join (path, dirent.name))
                : []
          )
    )
    .then
      ( results =>
          [] .concat (path, ...results)
      )
你是这样用的-

dirs ("MyFolder") .then (console.log, console.error)
console .log (dirsSync ("MyFolder"))

同步

我们可以使用同步函数重写上述函数-

const { readdirSync } =
  require ("fs")

const { join } =
  require ("path")

const dirsSync = (path = ".") =>
  [].concat
    ( path
    , ...readdirSync (path, { withFileTypes: true })
        .map
          ( dirent =>
              dirent .isDirectory ()
                ? dirsSync (join (path, dirent.name))
                : []
          )
    )
你是这样用的-

dirs ("MyFolder") .then (console.log, console.error)
console .log (dirsSync ("MyFolder"))
通过使用
Array.prototype.flatMap
-

const { readdirSync } =
  require ("fs")

const { join } =
  require ("path")

const dirsSync = (path = ".") =>
  [ path
  , ...readdirSync (path, { withFileTypes: true })
      .flatMap
        ( dirent =>
            dirent .isDirectory ()
              ? dirsSync (join (path, dirent.name))
              : []
        )
  ]

您需要格式化返回数组中的元素,对其进行迭代并对元素进行格式化,然后从格式化后的元素创建新数组以获得结果getDirectoriesRecursive()函数似乎工作得相当好。。也许你可以详细说明你到底出了什么问题?当我运行代码时,我得到输出:['.\\','Folder1','Folder1\\Folder11','Folder1\\Folder12','Folder2','Folder3','Folder3\\Folder31','Folder3\\Folder32']