使用fs-extra检测.bundle文件存在性异常:始终返回true如何解决?
解决fs-extra中fs.exists()始终返回true的问题
我之前也踩过这个坑,咱们来梳理下问题出在哪,以及怎么解决:
首先你得纠正一个认知:fs-extra的fs.exists()方法并不会在文件不存在时抛出Promise错误。你看到的资料大概率是混淆了原生Node.js fs模块的旧版API,或者其他文件操作方法的行为。实际上,fs-extra的exists(别名pathExists)会返回一个Promise<boolean>——文件存在时resolve为true,不存在时resolve为false,只有当出现权限不足、路径格式无效这类真正的错误时,才会reject抛出异常。
你现在的代码只监听了Promise的resolve状态,不管返回的是true还是false,都会执行console.log("true"),这就是为什么你看到始终输出true的原因。
正确的写法应该是这样:
const fs = require('fs-extra'); const path = require('path'); // 记得引入path模块处理路径 // 用path.join拼接路径,避免手动拼接的分隔符问题(比如Windows和Linux的斜杠差异) const targetBundlePath = path.join(themeDir, "Lights.bundle"); fs.exists(targetBundlePath) .then((fileExists) => { if (fileExists) { console.log("Lights.bundle存在,执行移动操作"); // 这里写移动文件的逻辑,比如用fs.move() return fs.move(targetBundlePath, '/目标文件夹路径/Lights.bundle', { overwrite: true }); } else { console.log("Lights.bundle不存在,使用默认文件"); // 这里写处理默认文件的逻辑,比如复制默认文件到指定位置 return fs.copy('/默认文件路径/default.bundle', targetBundlePath); } }) .then(() => { console.log("操作完成"); }) .catch((err) => { console.error("文件操作出错:", err); });
额外提醒两个关键点:
- 永远用
path.join()拼接路径,不要手动用+号拼接,否则很容易出现/fooLights.bundle这种错误路径,导致你的判断完全失效。 - 一定要加上
catch()捕获异常,比如当你没有权限访问目标路径、磁盘空间不足时,这些情况才会触发Promise的reject,需要你处理错误。
内容的提问来源于stack exchange,提问作者Joe Scotto
相关产品推荐
相关产品推荐

