You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:42:04