NodeJS 20中使用fs模块误将文件识别为目录的问题
问题分析与解决建议
核心问题
你遇到的isDirectory()对所有项都返回true的问题,大概率是路径处理错误导致fs.lstatSync读取的并非目标文件/文件夹的真实路径,或是代码中listItem与判断用的fileDetails路径不匹配。
排查与修复步骤
1. 验证传入fs.lstatSync的路径正确性
确保你传入的path是完整的绝对路径或正确拼接的相对路径。比如在递归遍历目录时,必须用path.join(parentPath, itemName)拼接子项的完整路径,不能直接使用子项名称作为路径。
可以临时添加日志验证路径和判断结果:
const fullPath = path.join(parentPath, itemName); // 替换成你的路径拼接逻辑 const fileDetails = fs.lstatSync(fullPath); console.log(`当前检查路径:${fullPath}`); console.log(`是否为目录:${fileDetails.isDirectory()}`); console.log(`是否为文件:${fileDetails.isFile()}`);
2. 确保listItem与fileDetails路径一致
你的代码注释提到listItem是元数据对象,要确认这个对象对应的路径和传给fs.lstatSync的路径完全一致,避免出现判断的路径和存入数组的元数据路径不匹配的情况。
3. 区分lstatSync与statSync的差异
如果你的文件系统存在符号链接,lstatSync会返回符号链接本身的属性,而statSync会跟随符号链接读取目标文件的属性。如果你的文件是指向目录的符号链接,可能会导致误判,可以临时替换成fs.statSync测试是否恢复正常。
修正后的递归读取示例
const fs = require('fs'); const path = require('path'); const traverseDir = (rootPath) => { const folders = []; const files = []; const scan = (currentPath) => { const items = fs.readdirSync(currentPath); items.forEach(item => { const fullPath = path.join(currentPath, item); const stats = fs.lstatSync(fullPath); const metaItem = { name: item, path: fullPath, size: stats.size, isDirectory: stats.isDirectory() }; if (stats.isDirectory()) { folders.push(metaItem); scan(fullPath); // 递归扫描子目录 } else { files.push(metaItem); } }); }; scan(rootPath); return { folders, files }; }; // 使用示例 const { folders, files } = traverseDir('./your-target-folder'); console.log('文件夹列表:', folders); console.log('文件列表:', files);
内容的提问来源于stack exchange,提问作者Rohit Handique
相关产品推荐
相关产品推荐

