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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 10:10:13