如何使用nodejs的fsPromise.access()判断文件权限

434 阅读2分钟

同学们可以私信我加入学习群!


一种错误示范

我们操作文件的时候,经常需要提前判断文件的状态:文件是否存在、文件是否可读、文件是否可写。 查看官网介绍后,按照我们平时的习惯,写个小demo:

        const copyPropertiesPathExist = await fsPromise.access(copyPropertiesPath, fs.constants.F_OK);  //检测路径是否存在
        const access1 = await fsPromise.access(copyPropertiesPath,fs.constants.W_OK | fs.constants.R_OK);  //检测读写权限
        const access2 = await fsPromise.access(copyPropertiesPath,fs.constants.W_OK);  //检测写权限
        const access3 = await fsPromise.access(copyPropertiesPath,fs.constants.R_OK);  //检测读权限
        console.log('copyPropertiesPathExist',copyPropertiesPathExist)
        console.log('11111111111',access1)
        console.log('111111111112',access2)
        console.log('111111111113',access3)

这个demo的关键代码只有四行,对应四种参数组合:

  • fs.constants.F_OK:检测文件是否存在
  • fs.constants.W_OK | fs.constants.R_OK:检测文件是否同时具备读和写权限
  • fs.constants.W_OK:检测文件是否具备写权限
  • fs.constants.R_OK:检测文件是否具备读权限

当文件符合上面所有的权限时,会发现copyPropertiesPathExist 、access1 、access2 、access3等四个变量都是undefined。而如果文件不符合其中的某个权限,则会直接在控制台报错。这显然不是我们想要的效果。

fsPromise.access正确的书写

查看官网(node版本v22),我们可以发现有两个关键的信息:

  • 成功时,返回值是undefined,所以将返回结果赋值给变量毫无意义。
  • 官网示例代码中,并没有赋值给变量,而是使用try catch抛出异常。 在这里插入图片描述 所以我们的代码参照官网,应该修改为: 在这里插入图片描述

上面的图片是项目中的代码,在try catch中捕获异常,并在发现异常时,抛出读写权限不足的异常信息。 catch之后的代码就是后续的业务代码。

为什么try catch不把所有的代码都包含?

因为后续有其他不相关的业务代码,如果try中把后续业务代码也包含,那么就无法确定当catch到异常时,究竟是文件权限不足,还是文件流出错,或者压缩jar包文件出错。


总结

大家如果需要联系博主,或者获取博主各系列文章对应的资源,可以通过中二少年学编程的个人主页来获取。

本文虽然简单,但是涉及到的api比较偏,网络资料较少,所以在此记录一下,帮助对node官网不熟悉的同学,更容易理解api的使用。

有任何前端项目、demo、教程需求,都可以联系博主,博主会视精力更新,免费的羊毛,不薅白不薅!~