Node.js使用fs模块递归获取目录文件并按指定扩展名筛选排序
基于fs模块的递归筛选+排序实现方案
实现思路
- 给原函数新增
allowedExts入参,用于传入允许的扩展名列表(注意带点,例如['.txt', '.js', '.json']) - 新增默认排序逻辑,支持自定义排序规则
- 推荐使用Node.js内置的
path模块处理路径拼接、扩展名提取,避免Windows/macOS路径分隔符不兼容问题
完整实现代码
const fs = require('fs'); const path = require('path'); /** * 递归获取指定目录下符合扩展名要求的文件 * @param {string} dir 目标目录路径 * @param {string[]} allowedExts 允许的扩展名列表,示例:['.js', '.md'] * @param {Array} files_ 递归用的内部参数,外部调用不需要传 * @returns {string[]} 筛选后排序完成的文件路径数组 */ function getFiles (dir, allowedExts, files_){ files_ = files_ || []; // 读取当前目录下的所有文件/文件夹 const files = fs.readdirSync(dir); for (const file of files){ const fullPath = path.join(dir, file); if (fs.statSync(fullPath).isDirectory()){ // 是文件夹就递归遍历 getFiles(fullPath, allowedExts, files_); } else { // 提取文件扩展名,转为小写做大小写不敏感匹配 const ext = path.extname(file).toLowerCase(); // 匹配允许的扩展名才加入结果 if (allowedExts.map(e => e.toLowerCase()).includes(ext)) { files_.push(fullPath); } } } // 全部收集完成后排序,默认按文件路径字典序升序 return files_.sort((a, b) => a.localeCompare(b)); } // 调用示例:获取D:/sample目录下所有.js和.json后缀的文件 console.log(getFiles('D:/sample', ['.js', '.json']));
关键逻辑说明
- 扩展名匹配默认做了大小写兼容处理:比如传入
.Js,文件后缀是.JS也能匹配到,如果需要严格大小写匹配,把代码里的toLowerCase()去掉即可 - 排序规则可以自定义:如果需要按文件大小、修改时间排序,可以在
sort回调里读取文件stat信息做判断,示例按修改时间降序排序的写法:
return files_.sort((a, b) => fs.statSync(b).mtimeMs - fs.statSync(a).mtimeMs)
小提示:如果不需要递归,只遍历当前层级目录,删掉递归调用文件夹的逻辑即可。
内容的提问来源于stack exchange,提问作者Kitsune
相关产品推荐
相关产品推荐

