九牛娱乐网
音乐播放器
Nodejs 获取指定文件夹下所有文件及文件夹

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

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

### 代码

```javascript

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"
}
]
}
]
}
]

附件/图片

附件图片
打赏列表 共 0 金币

暂无打赏记录,快来成为第一个打赏的人吧!

回复

全部评论 (0)

暂无评论,来发表第一条评论吧!

发表评论

剩余 100 字符