Node.js递归遍历文件夹筛选.html/.htm/.aspx后缀的文件
遍历筛选指定后缀文件的修改方案
问题根源
当前代码的过滤逻辑是基于固定文件名白名单做匹配,仅识别代码里写死的index.html、default.htm这类特定命名的文件,没有校验文件本身的扩展名属性,因此无法返回其他同后缀但命名不同的文件。
具体修改调整
- 移除原代码中存储固定文件名的
filenames集合,替换为存储目标扩展名的匹配集合 - 调用Node.js内置
path模块的extname()方法直接提取文件扩展名,替代手动拆分字符串取文件名的逻辑,避免Windows路径反斜杠适配、路径分段错误等兼容问题 - 统一将提取到的扩展名转为小写后做匹配,兼容
Demo.HTML、Test.HTM这类大小写混合的文件命名
修改后完整代码
// 原有遍历逻辑无需调整,可直接保留 async function getAllFile(folderPath) { let files = await fs.readdir(folderPath); files = await Promise.all( files.map(async (file) => { const filePath = path.join(folderPath, file); const stats = await fs.stat(filePath); if (stats.isDirectory()) { return getAllFile(filePath); } else if (stats.isFile()) return filePath; }) ); return files.reduce((all, folderContents) => all.concat(folderContents), []); } // 替换原固定文件名匹配逻辑 const targetExtSet = new Set([".html", ".htm", ".aspx"]); const filterFiles = async (folderPath) => { const allPaths = await getAllFile(folderPath); return allPaths.filter((filePath) => { // 提取文件扩展名并统一转小写匹配 const fileExt = path.extname(filePath).toLowerCase(); return targetExtSet.has(fileExt); }); };
效果说明
调整后的逻辑不限制文件本身的命名,只要文件后缀是三个目标后缀之一,不管是test.html、news.htm、product.aspx都会被正常返回,完全覆盖所有满足扩展名要求的文件。同时内置方法取扩展名的逻辑,不存在路径分隔符兼容问题。
内容的提问来源于stack exchange,提问作者Aakash
相关产品推荐
相关产品推荐

