每次nodejs做有关文件操作的时候几乎都会用到,创建文件目录啊,删除文件夹啊这样的操作。时间一久就会发现有些操作很繁琐:删除多层文件夹,创建多层文件夹。 (注意:代码中的异步我直接用await是由于我引入了'mz/fs',mz这个包用Promise包装了下原生的操作)
# 1 深(多)层删除文件夹
node提供了删除文件夹的操作:
fs.rmdir() // 异步的
fs.rmdirSync() //同步的
但该操作仅仅能删除空文件夹。
那么假如我们有如下这样的一个文件夹
我们要删掉1这个目录那么得先干掉里面的文件和文件夹,里面的文件夹要干掉就需要再干掉里面的文件和文件夹。好了道理貌似都懂关键是代码怎么写。
下面是代码:
let rmDirs = (function () {
async function iterator(url, dirs) {
var stat = await fs.stat(url);
if (stat.isDirectory()) {
dirs.unshift(url); //收集目录
await inner(url, dirs);
} else if (stat.isFile()) {
await fs.unlink(url); //直接删除文件
}
}
async function inner(path, dirs) {
var arr = await fs.readdir(path);
await Promise.all(arr.map(v => iterator(path + "/" + v, dirs)));
}
return async function (dir) {
var dirs = [];
try {
await iterator(dir, dirs);
//继发:先删最里层然后依次删外层
for (let v of dirs) {
await fs.rmdir(v);
}
//并发:所有文件夹一起可能会报错
/* await Promise.all(dirs.map(v => fs.rmdir(v)));*/
} catch (e) {
throw e;
}
}
})();
# 2 深(多)层创建文件夹
nodejs提供了文件夹创建的的操作:
fs.mkdir() //异步
fs.mkdirSync() //同步
但该操作只能在已有的文件夹下创建文件夹
假如c:/a 下什么都没有,我们想建 c:/a/b/c/d/e/f 如果直接将这个路径给mkdir是肯定不行的。 那么坑定是要获取这个路径的上级目录如果存在侧返回true,后面判断是true的时候就创建,如果不存在就继续找上级目录存在的时候返回true,不存在继续找上级目录。 下面是代码:
/* 深层创建文件目录 */
async mkDirs(dirname) {
if (await fs.exists(dirname)) {
return true
} else {
if (await this.mkDirs(path.dirname(dirname))) {
await fs.mkdir(dirname)
return true
}
}
};
就是这么点。
# 3总结
代码随简但是凡事要多思考,比如把诸如此类的操作的方法都放在一个工具类中,再做成单例模式。