Nodejs 获取指定文件夹下所有文件及文件夹

2,712 阅读3分钟

Nodejs 获取指定文件夹下所有文件及文件夹

做项目时候经常会遇到获取本地某个文件夹下所有内容的情况;下面简单列举两种方法。

方法一 文件及文件夹扁平化输出

代码


const fs = require('fs');

function getFilesAndFoldersInDir(path) {
  const items = fs.readdirSync(path);
  const result = [];
  items.forEach(item => {
    const itemPath = `${path}/${item}`;
    const stat = fs.statSync(itemPath);
    if (stat.isDirectory()) {
      let data = {
        // 文件夹
        type: 'folder',
        name: item
      }
      let children = getFilesAndFoldersInDir(itemPath)
      if (children && children.length) {
        data.children = children
      }
      result.push(data);
    } else {
      // 文件
      result.push({
        type: 'file',
        name: item
      });
    }
  });
  return result;
}

let list = getFilesAndFoldersInDir('/jay')
console.log(list)

输出结构

[
  {
    "size": 1224860,
    "name": "周杰伦-Intro.mp3",
    "path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-Intro.mp3"
  },
  {
    "size": 7432949,
    "name": "周杰伦-Mojito.mp3",
    "path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-Mojito.mp3"
  },
  {
    "size": 9866516,
    "name": "周杰伦-不爱我就拉倒.mp3",
    "path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-不爱我就拉倒.mp3"
  },
  {
    "size": 9401524,
    "name": "周杰伦-倒影.mp3",
    "path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-倒影.mp3"
  },
  {
    "size": 10831295,
    "name": "周杰伦-等你下课 (with 杨瑞代).mp3",
    "path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-等你下课 (with 杨瑞代).mp3"
  },
  {
    "size": 10346118,
    "name": "周杰伦-错过的烟火.mp3",
    "path": "/jay/《最伟大的作品》专辑MP3/目录1/周杰伦-错过的烟火.mp3"
  },
  {
    "size": 10687350,
    "name": "周杰伦-我是如此相信.mp3",
    "path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-我是如此相信.mp3"
  },
  {
    "size": 9794418,
    "name": "周杰伦-最伟大的作品.mp3",
    "path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-最伟大的作品.mp3"
  },
  {
    "size": 7504609,
    "name": "周杰伦-粉色海洋.mp3",
    "path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-粉色海洋.mp3"
  },
  {
    "size": 10316859,
    "name": "周杰伦-红颜如霜.mp3",
    "path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-红颜如霜.mp3"
  },
  {
    "size": 8926108,
    "name": "周杰伦-说好不哭 (with 五月天阿信).mp3",
    "path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-说好不哭 (with 五月天阿信).mp3"
  },
  {
    "size": 10664502,
    "name": "周杰伦-还在流浪.mp3",
    "path": "/jay/《最伟大的作品》专辑MP3/目录2/周杰伦-还在流浪.mp3"
  }
]

方法二 文件及文件夹以树状结构输出

代码

// 获取文件夹下所有文件
function getFilesAndFoldersInDir(path) {
  const filesList = [];
  readFile(path, filesList);
  return filesList;
}

// 遍历读取文件
function readFile(path, filesList) {
  const files = fs.readdirSync(path); // 需要用到同步读取
  files.forEach(walk);

  function walk(file) {
    const states = fs.statSync(path + '/' + file);
    if (states.isDirectory()) {
      readFile(path + '/' + file, filesList);
    } else {
// 创建一个对象保存信息
      const obj = {};
      obj.size = states.size; // 文件大小,以字节为单位
      obj.name = file; // 文件名
      obj.path = path + '/' + file; // 文件绝对路径
      filesList.push(obj);
    }
  }
}

let list = getFilesAndFoldersInDir('/jay')
console.log(list)

输出结构

[
  {
    "type": "folder",
    "name": "《最伟大的作品》专辑MP3",
    "children": [
      {
        "type": "folder",
        "name": "目录1",
        "children": [
          {
            "type": "file",
            "name": "周杰伦-Intro.mp3"
          },
          {
            "type": "file",
            "name": "周杰伦-Mojito.mp3"
          },
          {
            "type": "file",
            "name": "周杰伦-不爱我就拉倒.mp3"
          },
          {
            "type": "file",
            "name": "周杰伦-倒影.mp3"
          },
          {
            "type": "file",
            "name": "周杰伦-等你下课 (with 杨瑞代).mp3"
          },
          {
            "type": "file",
            "name": "周杰伦-错过的烟火.mp3"
          }
        ]
      },
      {
        "type": "folder",
        "name": "目录2",
        "children": [
          {
            "type": "file",
            "name": "周杰伦-我是如此相信.mp3"
          },
          {
            "type": "file",
            "name": "周杰伦-最伟大的作品.mp3"
          },
          {
            "type": "file",
            "name": "周杰伦-粉色海洋.mp3"
          },
          {
            "type": "file",
            "name": "周杰伦-红颜如霜.mp3"
          },
          {
            "type": "file",
            "name": "周杰伦-说好不哭 (with 五月天阿信).mp3"
          },
          {
            "type": "file",
            "name": "周杰伦-还在流浪.mp3"
          }
        ]
      }
    ]
  }
]