无论文件是否存在,如何保证路径可读可写?节点JS
How to ensure a path is readable and writable, regardless of whether a file exists? NodeJS
我的用例是我得到了一个配置文件目录,该目录可能已经存在也可能不存在。如果它已经存在,我想阅读它,如果它不存在,我想在那里写一些默认值,将来可以通过该文件进行用户配置。
如果我没有权限读取和写入该路径上的文件(无论文件是否已经存在),我想报告该错误以便进行更正。
这绝对可以使用一些重构,但似乎是一种可行的方法。不过,我怀疑有更简单的方法。还是希望其他人能给出更好的答案。
function canReadAndWrite(targetPath) {
return new Promise((resolve, reject) => {
fs.stat(targetPath, (err) => {
if (err) { reject(err); return; }
fs.access(targetPath, fs.W_OK | fs.R_OK, (err) => {
if (err) {
const dir = path.dirname(targetPath);
fs.access(dir, fs.W_OK | fs.R_OK, (err) => {
if (err) { reject(err); return; }
resolve(false);
});
}
resolve(true);
})
}
});
}
可以像这样使用:
canReadAndWrite('/var/lib/test/config.json').then((exists) => {
if (exists) {
// safely read file
} else {
// safely write file
}
}).catch((error) => {
console.log('nope');
});
我的用例是我得到了一个配置文件目录,该目录可能已经存在也可能不存在。如果它已经存在,我想阅读它,如果它不存在,我想在那里写一些默认值,将来可以通过该文件进行用户配置。
如果我没有权限读取和写入该路径上的文件(无论文件是否已经存在),我想报告该错误以便进行更正。
这绝对可以使用一些重构,但似乎是一种可行的方法。不过,我怀疑有更简单的方法。还是希望其他人能给出更好的答案。
function canReadAndWrite(targetPath) {
return new Promise((resolve, reject) => {
fs.stat(targetPath, (err) => {
if (err) { reject(err); return; }
fs.access(targetPath, fs.W_OK | fs.R_OK, (err) => {
if (err) {
const dir = path.dirname(targetPath);
fs.access(dir, fs.W_OK | fs.R_OK, (err) => {
if (err) { reject(err); return; }
resolve(false);
});
}
resolve(true);
})
}
});
}
可以像这样使用:
canReadAndWrite('/var/lib/test/config.json').then((exists) => {
if (exists) {
// safely read file
} else {
// safely write file
}
}).catch((error) => {
console.log('nope');
});