当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Node.js fs.access(path[, mode], callback)用法及代码示例


fs.access(path[, mode], callback)

历史
版本变化
v18.0.0

将无效回调传递给 callback 参数现在会抛出 ERR_INVALID_ARG_TYPE 而不是 ERR_INVALID_CALLBACK

v7.6.0

path 参数可以是使用 file: 协议的 WHATWG URL 对象。

v6.3.0

fs.R_OK 等直接存在于 fs 上的常量已作为软弃用移至 fs.constants 中。因此对于 Node.js < v6.3.0 使用 fs 来访问这些常量,或者执行类似 (fs.constants || fs).R_OK 的操作来处理所有版本。

v0.11.15

添加于:v0.11.15


参数

测试用户对 path 指定的文件或目录的权限。 mode 参数是一个可选整数,用于指定要执行的可访问性检查。 mode 应该是值 fs.constants.F_OK 或由 fs.constants.R_OKfs.constants.W_OKfs.constants.X_OK 中的任何一个的按位或组成的掩码(例如 fs.constants.W_OK | fs.constants.R_OK )。检查 File access constants 以获取 mode 的可能值。

最后一个参数 callback 是一个回调函数,使用可能的错误参数调用。如果任何可访问性检查失败,错误参数将是一个Error 对象。以下示例检查package.json 是否存在,以及它是否可读或可写。

import { access, constants } from 'node:fs';

const file = 'package.json';

// Check if the file exists in the current directory.
access(file, constants.F_OK, (err) => {
  console.log(`${file} ${err ? 'does not exist' : 'exists'}`);
});

// Check if the file is readable.
access(file, constants.R_OK, (err) => {
  console.log(`${file} ${err ? 'is not readable' : 'is readable'}`);
});

// Check if the file is writable.
access(file, constants.W_OK, (err) => {
  console.log(`${file} ${err ? 'is not writable' : 'is writable'}`);
});

// Check if the file is readable and writable.
access(file, constants.R_OK | constants.W_OK, (err) => {
  console.log(`${file} ${err ? 'is not' : 'is'} readable and writable`);
});

在调用 fs.open()fs.readFile()fs.writeFile() 之前,不要使用 fs.access() 检查文件的可访问性。这样做会引入竞争条件,因为其他进程可能会在两次调用之间更改文件的状态。相反,用户代码应该直接打开/读取/写入文件并处理文件不可访问时引发的错误。

写(不推荐)

import { access, open, close } from 'node:fs';

access('myfile', (err) => {
  if (!err) {
    console.error('myfile already exists');
    return;
  }

  open('myfile', 'wx', (err, fd) => {
    if (err) throw err;

    try {
      writeMyData(fd);
    } finally {
      close(fd, (err) => {
        if (err) throw err;
      });
    }
  });
});

写(推荐)

import { open, close } from 'node:fs';

open('myfile', 'wx', (err, fd) => {
  if (err) {
    if (err.code === 'EEXIST') {
      console.error('myfile already exists');
      return;
    }

    throw err;
  }

  try {
    writeMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

阅读(不推荐)

import { access, open, close } from 'node:fs';
access('myfile', (err) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  open('myfile', 'r', (err, fd) => {
    if (err) throw err;

    try {
      readMyData(fd);
    } finally {
      close(fd, (err) => {
        if (err) throw err;
      });
    }
  });
});

阅读(推荐)

import { open, close } from 'node:fs';

open('myfile', 'r', (err, fd) => {
  if (err) {
    if (err.code === 'ENOENT') {
      console.error('myfile does not exist');
      return;
    }

    throw err;
  }

  try {
    readMyData(fd);
  } finally {
    close(fd, (err) => {
      if (err) throw err;
    });
  }
});

上面的"not recommended" 示例检查可访问性,然后使用该文件; "recommended" 示例更好,因为它们直接使用文件并处理错误(如果有)。

通常,仅当文件不会被直接使用时才检查文件的可访问性,例如当它的可访问性是来自另一个进程的信号时。

在 Windows 上,目录上的access-control 策略 (ACL) 可能会限制对文件或目录的访问。但是,fs.access() 函数不会检查 ACL,因此即使 ACL 限制用户读取或写入路径,它也可能报告路径是可访问的。

相关用法


注:本文由纯净天空筛选整理自nodejs.org大神的英文原创作品 fs.access(path[, mode], callback)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。