path
{string|Buffer|URL}mode
{integer} 默认值:fs.constants.F_OK
。callback
{Function}err
{Error}
测试用户对 path
指定的文件或目录的权限。
mode
参数是一个可选的整数,指定要执行的可访问性检查。
查看[文件可访问性的常量][File access constants]了解 mode
的可选值。
可以创建由两个或更多个值按位或组成的掩码(例如 fs.constants.W_OK | fs.constants.R_OK
)。
最后一个参数 callback
是回调函数,调用时会传入可能的错误参数。
如果任何可访问性检查失败,则错误参数会是 Error
对象。
以下示例会检查 package.json
是否存在、以及是否可读或可写。
const file = 'package.json';
// 检查文件是否存在于当前目录中。
fs.access(file, fs.constants.F_OK, (err) => {
console.log(`${file} ${err ? '不存在' : '存在'}`);
});
// 检查文件是否可读。
fs.access(file, fs.constants.R_OK, (err) => {
console.log(`${file} ${err ? '不可读' : '可读'}`);
});
// 检查文件是否可写。
fs.access(file, fs.constants.W_OK, (err) => {
console.log(`${file} ${err ? '不可写' : '可写'}`);
});
// 检查文件是否存在于当前目录中、以及是否可写。
fs.access(file, fs.constants.F_OK | fs.constants.W_OK, (err) => {
if (err) {
console.error(
`${file} ${err.code === 'ENOENT' ? '不存在' : '只可读'}`);
} else {
console.log(`${file} 存在,且可写`);
}
});
不要在调用 fs.open()
、fs.readFile()
或 fs.writeFile()
之前使用 fs.access()
检查文件的可访问性。
这样做会引入竞态条件,因为其他进程可能会在两个调用之间更改文件的状态。
而是,应该直接打开、读取或写入文件,并且当文件无法访问时处理引发的错误。
写入(不推荐)
fs.access('文件', (err) => {
if (!err) {
console.error('文件已存在');
return;
}
fs.open('文件', 'wx', (err, fd) => {
if (err) throw err;
writeMyData(fd);
});
});
写入(推荐)
fs.open('文件', 'wx', (err, fd) => {
if (err) {
if (err.code === 'EEXIST') {
console.error('文件已存在');
return;
}
throw err;
}
writeMyData(fd);
});
读取(不推荐)
fs.access('文件', (err) => {
if (err) {
if (err.code === 'ENOENT') {
console.error('文件不存在');
return;
}
throw err;
}
fs.open('文件', 'r', (err, fd) => {
if (err) throw err;
readMyData(fd);
});
});
读取(推荐)
fs.open('文件', 'r', (err, fd) => {
if (err) {
if (err.code === 'ENOENT') {
console.error('文件不存在');
return;
}
throw err;
}
readMyData(fd);
});
上面的“不推荐”示例会先检查可访问性,然后再使用文件。 “推荐”示例则更好,因为它们直接使用文件并处理错误(如果有错误的话)。
通常,仅在不直接使用文件时(例如当其可访问性是来自其他进程的信号时),才检查文件的可访问性。
在 Windows 上,目录上的访问控制策略(ACL)可能会限制对文件或目录的访问。
但是,fs.access()
函数不检查 ACL,因此即使 ACL 限制用户读取或写入,也可能报告路径是可访问的。