Node.js文件存在判断异常:文件实际存在却返回不存在(含fs.stat问题)
这种问题我碰到过好多次,大概率是路径或者细节上的小坑,给你列几个最可能的排查方向:
路径不匹配(头号嫌疑人!)
Node.js里的相对路径是基于当前运行代码的工作目录,而不是脚本文件所在的目录。举个例子:如果你的脚本在/project/scripts/check-file.js,文件在/project/data.txt,但你是在/project/scripts目录下运行node check-file.js,那./data.txt会指向/project/scripts/data.txt,自然找不到。
解决办法:用绝对路径准没错!结合Node.js的路径模块生成绝对路径:// CommonJS 写法 const path = require('path'); // 生成脚本所在目录下的目标文件绝对路径 const targetFilePath = path.join(__dirname, '../data.txt'); // ES模块 写法(Node.js 14+) import path from 'path'; import { fileURLToPath } from 'url'; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); const targetFilePath = path.join(__dirname, '../data.txt');另外,建议把生成的路径
console.log出来,直接复制到文件管理器里打开,验证路径是否正确。文件名大小写不匹配
Windows系统不区分文件名大小写,但Linux/macOS是严格区分的!比如你代码里写的是Config.json,但实际文件是config.json,在Windows上能正常检测到,但放到Linux服务器上就会报错。
解决办法:统一文件名大小写,或者在代码里严格匹配实际文件名。文件权限不足
就算文件存在,当前运行Node.js的用户可能没有读取该文件的权限。比如在Linux下,文件权限是-rw-------(只有所有者能读写),但你用普通用户运行代码,就会被拒绝访问,返回类似文件不存在的错误。
解决办法:- Linux/macOS:用
ls -l 文件名查看权限,执行chmod +r 文件名添加可读权限。 - Windows:右键文件→属性→安全,给当前用户添加读取权限。
- Linux/macOS:用
符号链接(软链接)的坑
如果目标文件是软链接,注意fs.stat和fs.lstat的区别:fs.stat会跟随链接检测目标文件,而fs.lstat只检测链接本身。如果你误写了fs.lstat,而链接本身路径有问题,就会返回不存在。
解决办法:确认使用的是fs.stat,同时检查软链接的指向是否正确。文件被其他程序锁定
少数情况下,文件被其他程序(比如编辑器、办公软件)打开并锁定,导致Node.js无法访问。可以试试关闭所有可能占用该文件的程序,再重新运行检测代码。
内容的提问来源于stack exchange,提问作者mas cm

