let fs= require('fs') //使用fs模块来实现全部有关文件及目录的建立、写入及删除操做。
let path = require('path'); //用于处理文件与目录的路径。path.resolve() path.join()经常使用
function removeDir(){
let statObj = fs.statSync(p); // fs.statSync同步读取文件状态,判断是文件目录仍是文件。
if(statObj.isDirectory()){ //若是是目录
let dirs = fs.readdirSync(p) //fs.readdirSync()同步的读取目标下的文件 返回一个不包括 '.' 和 '..' 的文件名的数组['b','a']
dirs = dirs.map(dir => path.join(p, dir)) //拼上完整的路径
for (let i = 0; i < dirs.length; i++) {
// 深度 先将儿子移除掉 再删除掉本身
removeDir(dirs[i]);
}
fs.rmdirSync(p); //删除目录
}else{
fs.unlinkSync(p); //删除文件
}
}
removeDir('a');
复制代码
let fs = require('fs');
let path = require('path');
function removeDir(p, callback) {
fs.stat(p, (err, statObj) => {
if (statObj.isDirectory()) {
fs.readdir(p, function(err, dirs) {//读取p下面的文件
// 异步怎么递归?
// next函数用来递归的
dirs = dirs.map(dir => path.join(p, dir));
function next(index){
if index=== dirs.length return fs.rmdir(p, callback)
let files = dirs[index];
removeDir(files,()=>{
next(index + 1)
})
}
next(0)
})
} else { // 文件删除执行callback便可
fs.unlink(p, callback);
}
});
}
removeDir('a', function() {
console.log('删除成功了')
});
复制代码
let fs = require('fs');
let path = require('path');
function removeDir(p) {
return new Promise((resolve,reject)=>{ //返回一个promise对象
fs.stat(p,(err,statObj)=>{ // 异步读取文件判断文件类型 是目录 递归 不然就删除便可
if(statObj.isDirectory()){
fs.readdir(p, function(err, dirs) { //读取p下面的文件
// 映射路径
dirs = dirs.map(dir => path.join(p, dir));
// 映射promise
dirs = dirs.map(dir => removeDir(dir));// 递归调用,p下面的文件再次调用判断删除方法
// 删除完儿子后 删除本身
Promise.all(dirs).then(() => {
fs.rmdir(p, resolve);
});
});
}else{
fs.unlink(p, resolve);
}
}
}
}
removeDir('a');
复制代码
let fs = require('fs');
let path = require('path');
let util = require('util');
//util 是一个 Node.js 核心模块,提供了一些经常使用函数,用于弥补核心 JavaScript 的功能过于精简的不足。这些函数都包含在 util 模块中,能够经过引用模块来使用它们。
let stat = util.promisify(fs.stat);//判断文件类型
//util.promisify将一个接收回调函数参数的函数转换成一个返回Promise的函数。
let readdir = util.promisify(fs.readdir);//判断文件类型下面的文件
let rmdir = util.promisify(fs.rmdir);//删除目录
let unlink = util.promisify(fs.unlink);//删除文件
async function removeDir(p){
let statObj = await stat(p);
if(statObj.isDirectory()){
let dirs = await readdir(p);
dirs = dirs.map(dir => path.join(p, dir));
dirs = dirs.map(dir => removeDir(dir));
await Promise.all(dirs);
await rmdir(p)
}else{
// 要等待文件删除后 才让promise执行完 因此须要await
await unlink(p);
}
}
removeDir('a').then(()=>{
console.log('删除成功')
})
复制代码
// 讲a,a/b,a/c.js,a/b/d,a/b/d/f 放到一个数组中。数组
let fs = require('fs');
let path = require('path');
function removeDir(p){
let arr=[p];
let index=0;
while(current = arr[index++]){
let statObj = fs.statSync(current);
if (statObj.isDirectory()) {
let dirs = fs.readdirSync(current);
arr = [...arr, ...dirs.map(d => path.join(current, d))];
//[ 'a', 'a/a.js', 'a/b' ]
//[ 'a', 'a/a.js', 'a/b', 'a/b/c' ]
//[ 'a', 'a/a.js', 'a/b', 'a/b/c' ]
}
}
for (let i = arr.length - 1; i >= 0; i--) {
let statObj = fs.statSync(arr[i]);
if (statObj.isDirectory()) {
fs.rmdirSync(arr[i])
} else {
fs.unlinkSync(arr[i])
}
}
}
removeDir('a')
复制代码