nodejs笔记-文件树遍历
遍历文件树,执行删除操作
同步创建文件树
let fs = require("fs")
let { resolve, join } = require("path")
function mkdirSync(paths){
let arr = paths.split("/").filter(item=>item);
for(let i=0;i<arr.length;i++){
let dir = arr.slice(0,i+1).join("/");
try{
fs.accessSync(dir)
}catch(error){
fs.mkdirSync(dir)
}
}
}
// 创建
mkdirSync("a/b/c/d")
异步创建文件树
function mkdir(paths,cb){
let dir = paths.split("/").filter(f=>f);
function next(index){
let p = dir.slice(0,index+1).join("/");
fs.access(p,(err)=>{
if (index > dir.length) return cb();
if (err) {
fs.mkdir(p,(err)=>next(++index))
} else {
next(++index)
}
})
}
next(0);
}
// 创建
mkdir("a/b/c/d",()=>console.log("success"))
删除
// 先序 深度 遍历
function removeDirSync(dir) {
try {
let statObj = fs.statSync(dir)
if (statObj.isDirectory()) {
fs.readdirSync(dir)
.filter((d) => d)
.forEach((d) => removeDirSync(join(dir, d)))
fs.rmdirSync(dir)
console.log("rmdirSync", dir)
} else {
console.log("unlinjSync", dir)
fs.unlinkSync(dir)
}
} catch (err) {
console.log("路径不存在", dir)
}
}
// removeDirSync(resolve(__dirname, "../a"))
// 广度遍历(同步)
function wideSync(dir) {
let arr = [dir]
let index = 0
let current
while ((current = arr[index++])) {
let statObj = fs.statSync(current)
if (statObj.isDirectory()) {
let dirs = fs.readdirSync(current)
dirs = dirs.map((d) => join(current, d))
arr = [...arr, ...dirs]
}
}
for (let i = arr.length - 1; i >= 0; i--) {
let f = arr[i]
let statObj = fs.statSync(f)
if (statObj.isDirectory()) {
fs.rmdirSync(f)
} else {
fs.unlinkSync(f)
}
}
}
// wideSync(resolve(__dirname, "../a"))
// 先序 深度 串行
function rmdirSeries(dir, cb=()=>{}) {
fs.stat(dir,(err,statObj)=>{
if(err) return console.log(err);
if(statObj.isDirectory()){
fs.readdir(dir,(err,dirs)=>{
dirs = dirs.map(d=>join(dir,d));
function next(index){
if(index === dirs.length) return fs.rmdir(dir,cb);
rmdirSeries(dirs[index],()=>next(index+1))
}
next(0)
})
}else{
fs.unlink(dir,(err)=>{
if(!err) console.log(`unlink ${dir} success!`)
cb && cb();
})
}
})
}
// rmdirSeries(resolve(__dirname, "../a"), () => console.log("success"))
// 异步 相序 并发 删除
function removeDirParalle(dir,cb){
fs.stat(dir,(err,statObj)=>{
if(statObj.isDirectory()){
fs.readdir(dir, (err,dirs) => {
if (dirs.length === 0) return fs.rmdir(dir, cb)
dirs = dirs.map((d) => {
let nextdir = join(dir, d)
removeDirParalle(nextdir, done)
return nextdir
})
let index = 0
function done() {
if (++index === dirs.length) {
return fs.rmdir(dir, cb)
}
}
})
}else{
fs.unlink(dir,cb)
}
})
}
removeDirParalle(resolve(__dirname, "../a"), () => console.log("success"))