代码之家  ›  专栏  ›  技术社区  ›  user3142695

如何获取所有子目录并返回它们的路径?

  •  0
  • user3142695  · 技术社区  · 3 年前

    假设存在以下文件夹结构:

    /apps
    |- /group1
    |  |- /project1
    |  |- /project2
    |- /group2
    |  |- /project3
    |  |- /project4
    

    我需要获得所有项目的路径,这些项目都是两级的(组文件夹和项目文件夹)。

    所以我从这个开始:

    import { readdirSync } from 'fs'
    
    const directoriesInDirectory = readdirSync([rootPath, 'apps'].join('/'), {
      withFileTypes: true
    })
    .filter((item) => item.isDirectory())
    .map((item) => item.name)
    

    这给了我所有的小组 ['group1', 'group2'] .

    但我需要明白:

    [
        'apps/group1/project1',
        'apps/group1/project2',
        'apps/group2/project3',
        'apps/group2/project4'
    ]
    
    2 回复  |  直到 3 年前
        1
  •  0
  •   code    3 年前

    你需要表演 readdirSync 多次,一次用于 app 目录,其余为嵌套目录。此外,如果您调整了非阻塞特性,则可以使用promise,而不是使用sync:

    import { readdir } from 'fs/promises'
    
    const startPath = [rootPath, 'apps'].join('/')
    
    const parentDirs = (
      await readdir(startPath, {
        withFileTypes: true,
      })
    )
      .filter((item) => item.isDirectory())
      .map((item) => item.name)
    
    const projectPaths = (
      await Promise.all(
        parentDirs.map(async (dir) => {
          const projects = (
            await readdir(startPath + '/' + dir, {
              withFileTypes: true,
            })
          )
            .filter((item) => item.isDirectory())
            .map((item) => item.name)
          return { dir, projects }
        })
      )
    )
      .map(({ dir, projects }) =>
        projects.map((project) => [startPath, dir, projects].join('/'))
      )
      .flat()
    
    console.log(projectPaths) // ['apps/group1/project1', 'apps/group1/project2', ...]
    
        2
  •  0
  •   cqb13    3 年前

    我相信这段代码应该能满足你的需求,我不知道如果你添加更多的子目录,它会有多好,我做了有限的测试,但它应该可以正常工作。

    const fs = require("fs");
    const path = require("path");
    
    function getSubdirectories(rootPath) {
      const result = [];
    
      const directoriesInDirectory = fs
        .readdirSync(rootPath, {
          withFileTypes: true
        })
        .filter(item => item.isDirectory())
        .map(item => item.name);
    
      directoriesInDirectory.forEach(dir => {
        const subdirectories = getSubdirectories(path.join(rootPath, dir));
        // for each directory in the root directory, check if it has subdirectories
        if (subdirectories.length > 0) {
          subdirectories.forEach(subdir => {
            result.push(path.join(dir, subdir));
          });
        } else {
          result.push(dir);
        }
      });
    
      return result;
    }
    
    const subdirectories = getSubdirectories("./app");
    
    const subdirectoryPaths = subdirectories.map(subdir => {
      return path.join("app", subdir);
    });
    
    console.log(subdirectoryPaths);
    推荐文章