在使用NodeJS的时候,用fs.mkdir直接创建多层路径,如果上级目录不存在,这时会报错,也就是说NodeJS不支持直接创建多层路径,这时就要先把上级目录创建出来。所以我们一般会自己写程序来判断路径是否存在,如果不存在则自动创建该目录,说起来轻松,但其实这时一个挺繁琐的过程。下面看代码
/**
* 读取路径信息
* @param {string} path 路径
*/
function getStat(path){
return new Promise((resolve, reject) => {
fs.stat(path, (err, stats) => {
if(err){
resolve(false);
}else{
resolve(stats);
}
})
})
}
/**
* 创建路径
* @param {string} dir 路径
*/
function mkdir(dir){
return new Promise((resolve, reject) => {
fs.mkdir(dir, err => {
if(err){
resolve(false);
}else{
resolve(true);
}
})
})
}
/**
* 路径是否存在,不存在则创建
* @param {string} dir 路径
*/
async function dirExists(dir){
let isExists = await getStat(dir);
//如果该路径且不是文件,返回true
if(isExists && isExists.isDirectory()){
return true;
}else if(isExists){ //如果该路径存在但是文件,返回false
return false;
}
//如果该路径不存在
let tempDir = path.parse(dir).dir; //拿到上级路径
//递归判断,如果上级目录也不存在,则会代码会在此处继续循环执行,直到目录存在
let status = await dirExists(tempDir);
let mkdirStatus;
if(status){
mkdirStatus = await mkdir(dir);
}
return mkdirStatus;
}
下面来看实际中应用
比如,我们想在2018/a/b目录下写入一个txt文件,但有不确定2018/a/b目录是否存在
async function fn(){
await dirExists('./2018/a/b');
fs.writeFile('./2018/a/b/1.txt', '好迪真好,大家好才是真的好', err => {
if(err) return console.log(err);
console.log('写入成功')
})
}
fn();
执行结果