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