fs.access(path[, mode], callback)
path<string> | <Buffer> | <URL>mode<integer> 默认值:fs.constants.F_OKcallback<Function>err<Error>
测试用户对由 path 指定的文件或目录的权限。
mode 参数是一个可选的整数,用于指定要执行的可访问性检查。mode 应为 fs.constants.F_OK 的值,或由 fs.constants.R_OK、fs.constants.W_OK 和 fs.constants.X_OK 中任意组合按位或计算得到的掩码(例如 fs.constants.W_OK | fs.constants.R_OK)。请查看 文件访问常量 以了解 mode 的可能取值。
【Tests a user's permissions for the file or directory specified by path.
The mode argument is an optional integer that specifies the accessibility
checks to be performed. mode should be either the value fs.constants.F_OK
or a mask consisting of the bitwise OR of any of fs.constants.R_OK,
fs.constants.W_OK, and fs.constants.X_OK (e.g.
fs.constants.W_OK | fs.constants.R_OK). Check File access constants for
possible values of mode.】
最后一个参数 callback 是一个回调函数,会在可能的错误参数下被调用。如果任何可访问性检查失败,错误参数将是一个 Error 对象。以下示例检查 package.json 是否存在,以及它是否可读或可写。
【The final argument, callback, is a callback function that is invoked with
a possible error argument. If any of the accessibility checks fail, the error
argument will be an Error object. The following examples check if
package.json exists, and if it is readable or writable.】
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() 来检查文件的可访问性。这样做会引入竞争条件,因为其他进程可能在两次调用之间改变文件的状态。相反,用户代码应该直接打开/读取/写入文件,如果文件不可访问则处理引发的错误。
【Do not use fs.access() to check for the accessibility of a file before calling
fs.open(), fs.readFile(), or fs.writeFile(). Doing
so introduces a race condition, since other processes may change the file's
state between the two calls. Instead, user code should open/read/write the
file directly and handle the error raised if the file is not accessible.】
写 (不推荐)
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;
});
}
}); 上面的“不推荐”示例先检查可访问性然后再使用文件;“推荐”示例更好,因为它们直接使用文件,并处理可能出现的错误。
【The "not recommended" examples above check for accessibility and then use the file; the "recommended" examples are better because they use the file directly and handle the error, if any.】
一般来说,只有在文件不会被直接使用时才检查其可访问性,例如当其可访问性是来自另一个进程的信号时。
【In general, check for the accessibility of a file only if the file will not be used directly, for example when its accessibility is a signal from another process.】
在 Windows 上,目录的访问控制策略(ACL)可能会限制对文件或目录的访问。然而,fs.access() 函数不会检查 ACL,因此即使 ACL 限制用户读取或写入,它也可能报告某个路径是可访问的。
【On Windows, access-control policies (ACLs) on a directory may limit access to
a file or directory. The fs.access() function, however, does not check the
ACL and therefore may report that a path is accessible even if the ACL restricts
the user from reading or writing to it.】