做项目时候经常会遇到获取本地某个文件夹下所有内容的情况;下面简单列举两种方法。
## 方法一 文件及文件夹扁平化输出 ### 代码 ```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"
}
]
}
]
}
]
{
"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)
暂无评论,来发表第一条评论吧!
发表评论