在 Node.js 环境下,可以通过哪些方式判断指定路径对应的是文件还是目录?请说明原理与适用场景。
考察说明
考查 Node.js 文件系统模块中路径类型判断的核心 API 及其差异。
回答思路
- 【回答框架 1】Node.js 提供 fs.stat() 或 fs.lstat() 获取路径元数据,元数据对象包含 isFile() 和 isDirectory() 方法。isFile() 返回 true 表示常规文件,isDirectory() 返回 true 表示目录。lstat() 与 stat() 的区别在于 lstat() 返回符号链接自身的元数据,而 stat() 跟随符号链接指向的实际文件或目录。
- 【回答框架 2】fs.stat() 系列 API 提供同步(fs.statSync)和异步(fs.stat、fs.promises.stat)版本。异步版本基于回调或 Promise,避免阻塞事件循环;同步版本适用于脚本初始化或 CLI 工具。fs.access() 只能检测存在性和权限,无法直接区分类型。
- 【回答框架 3】除 stat() 外,还可以使用 fs.existsSync() 先判断存在,再配合 statSync() 判断类型,但存在竞态窗口。更推荐使用 fs.promises.stat() 结合 async/await,代码更清晰且避免嵌套回调。
- 【回答框架 4】实际处理时需要处理错误:若路径不存在或权限不足,stat() 会抛出异常或返回错误,需捕获并做相应处理。对于符号链接,根据业务需求选择 stat() 或 lstat()。
- 【关键点 1】fs.stat() 与 fs.lstat() 返回的对象具有 isFile() 和 isDirectory() 方法。
- 【关键点 2】lstat() 不跟随符号链接,stat() 会跟随。
- 【关键点 3】异步版本避免阻塞事件循环,同步版本适合一次性脚本。
- 【关键点 4】fs.access() 无法判断类型。
- 【易错点 1】忽略 stat() 回调中的错误可能导致未捕获异常。
- 【易错点 2】混淆 stat() 与 lstat() 在处理符号链接时的行为差异。
- 【易错点 3】依赖 fs.existsSync() 后立即使用 statSync() 可能产生竞态条件。