创建文件夹
同步创建文件夹
如果需要创建如图所示的文件目录
思路:
- 将文件路径切割,并遍历路径,并依次拼接
- 通过try,catch异常捕获,fs.accessAsync 如果路径不存在则创建
const fs = require("fs");
function mkdirSync(dir) {
let paths = dir.split("/")
for (let i = 1; i < paths.length; i++){
let newPath = paths.slice(0, i).join("/")
console.log("newPath",newPath)
try {
fs.accessSync(newPath)
} catch (err) {
fs.mkdirSync(newPath)
}
}
}
mkdirSync('A/B/C/', () => {
console.log("success")
})
异步创建文件夹
思路
- 通过index指针,拼接出当前的路径,fs.access如果不存在则创建文件夹,如果存在则继续将指针向下移动
function mkdirAsync(dir,cb) {
let index = 1;
let paths = dir.split('/')
function next(index) {
if (index == paths.length) return cb()
let newPath = paths.slice(0, index).join('/')
fs.access(newPath, (err) => {
if (err) {
fs.mkdir(newPath, (err) => {
next(index+1)
})
} else {
next(index+1)
}
})
}
mkdirAsync('A/B/C/', () => {
console.log("success")
})
删除文件夹
同步删除文件夹
思路:
- fs.readdirSync 同步的读取文件路径的文件情况
- 遍历文件,如果为文件则直接删除,如果为目录则递归的处理,如果文件删除完毕,则删除目录
function rmkdirSync(dir) {
let files = fs.readdirSync(dir)
for (let i = 0; i < files.length; i++) {
let newPath = path.join(dir, files[i])
let statObj = fs.statSync(newPath)
if (statObj.isDirectory()) {
rmkdirSync(newPath)
} else {
fs.unlinkSync(newPath)
}
}
fs.rmdirSync(dir)
}
rmkdirSync('A', () => {
console.log("success")
})
异步删除文件夹
思路:
- fs.stat获取文件状态,如果为目录则读取目录所有文件,并拼接路径,对每个路径进行递归的处理,当所有的文件resolve掉后则删除当前目录
- 如果为文件则直接删除,并resolve当前promise
function rmkdirAsync(dir) {
return new Promise((resolve, reject) => {
fs.stat(dir, (err, statObj) => {
if (statObj.isDirectory()) {
fs.readdir(dir, (err, files) => {
files = files.map((file) => path.join(dir, file))
files = files.map((file) => rmkdirAsync(file))
Promise.all(files).then(() => {
fs.rmdir(dir, resolve)
})
})
} else {
fs.unlink(dir, resolve)
}
})
})
}
rmkdirAsync('A').then(res => {
console.log('success')
})