稳定性: 0 - 弃用: 改为使用 [
fs.stat()
] 或 [fs.access()
]。
path
{string|Buffer|URL}callback
{Function}exists
{boolean}
通过检查文件系统来测试给定的路径是否存在。
然后调用 callback
并带上参数 true
或 false
:
fs.exists('/etc/passwd', (exists) => {
console.log(exists ? '存在' : '不存在');
});
此回调的参数与其他 Node.js 回调不一致。
通常,Node.js 回调的第一个参数是 err
参数,后面可选地跟随其他参数。
fs.exists()
的回调只有一个布尔值参数。
这是推荐 fs.access()
代替 fs.exists()
的原因之一。
不建议在调用 fs.open()
、fs.readFile()
或 fs.writeFile()
之前使用 fs.exists()
检查文件是否存在。
这样做会引入竞态条件,因为其他进程可能会在两次调用之间更改文件的状态。
相反,应该直接打开、读取或写入文件,如果文件不存在则处理引发的错误。
写入(不推荐)
fs.exists('myfile', (exists) => {
if (exists) {
console.error('myfile 已存在');
} else {
fs.open('myfile', 'wx', (err, fd) => {
if (err) throw err;
writeMyData(fd);
});
}
});
写入(推荐)
fs.open('myfile', 'wx', (err, fd) => {
if (err) {
if (err.code === 'EEXIST') {
console.error('myfile 已存在');
return;
}
throw err;
}
writeMyData(fd);
});
读取(不推荐)
fs.exists('myfile', (exists) => {
if (exists) {
fs.open('myfile', 'r', (err, fd) => {
if (err) throw err;
readMyData(fd);
});
} else {
console.error('myfile 不存在');
}
});
读取(推荐)
fs.open('myfile', 'r', (err, fd) => {
if (err) {
if (err.code === 'ENOENT') {
console.error('myfile 不存在');
return;
}
throw err;
}
readMyData(fd);
});
上面的“不推荐”示例会先检查文件是否存在然后再使用该文件。 “推荐”示例则更好,因为它们直接使用文件并处理错误(如果有错误的话)。
通常,仅在文件不直接使用时才检查文件是否存在,例如当其存在性是来自另一个进程的信号时。