主要是因为在网上查找时,能够有助于理解的太少 。一版为自己写的一版为听老师讲的
// 删除有文件的文件夹?
// 如删除images文件夹(不能手动删除)
// images/01.png
// images/02.jpg
// images/tabbar/01.jpgimages/tabbar/02.jpg
// images/upload/01.jpgimages/upload/02.jpglet fs = require("fs")
const { readdir } = require("fs/promises");
fs.readdir("./images", (err, files) => {
if (err) {
console.log(err);
} else {
// 先循环最外层的文件夹
for (let i = 0;
i < files.length;
i++) {
// 将路径保存成一个常量
const statData = https://www.it610.com/article/`./images/${files[i]}`
console.log(statData);
// 判断这个常量是文件还是文件夹
fs.stat(statData, (err, data) => {
if (err) {
console.log(err);
} else {
// 如果是文件就删除
if (data.isFile()) {
console.log("是文件");
fs.unlink(statData, (err) => {
if (err) {
console.log(err);
} else {
console.log("删除成功");
}
})
// 如果是文件夹,就再次遍历
} else if (data.isDirectory()) {
// 第二层是文件
fs.readdir(statData, (err, files2) => {
if (err) {
console.log(err);
} else {
// console.log(files2);
for (let j = 0;
j < files2.length;
j++) {
// 保存第二层的路径
const statData2 = `${statData}/${files2[j]}`
// console.log(statData2);
// 判断是否为文件
fs.stat(statData2, (err, data) => {
if (err) {
console.log(err);
} else {if (data.isFile()) {
fs.unlink(statData2, (err) => {
if (err) {
console.log(err);
} else {
console.log("删除成功");
}
})
}
}
})
}
fs.rmdir(statData, (err) => {
if (err) {
console.log(err);
} else {
console.log("删除成功");
}
})
}
})}
}
})
}
}
})
fs.rmdir("./images", (err) => {
if (err) {
console.log(err);
} else {
console.log("删除成功");
}
})
这个是理解过程,注意是用判断和循环
还用到了关于nodeJS中关于文件和文件夹的操作
以下是使用递归写出来的效果
// 删除有文件的文件夹?
// 如删除images文件夹(不能手动删除)
// images/01.png
// images/02.jpg
// images/tabbar/01.jpgimages/tabbar/02.jpg
// images/upload/01.jpgimages/upload/02.jpglet fs = require("fs")
const { readdir } = require("fs/promises");
// 封装函数,使用递归
function deleteFiles(filesName) {
fs.readdir(filesName, (err, files) => {
if (err) {
console.log(err);
} else {
if (files.length === 0) {
fs.rmdir(filesName, (err) => {
if (err) {
console.log(err);
} else {
console.log("删除成功");
}
})
} else {
for (let i = 0;
i < files.length;
i++) {
// 保存路径
const statData = https://www.it610.com/article/`${filesName}/${files[i]}`
// console.log(statData);
// 判断是否为文件
fs.stat(statData, (err, data) => {
if (err) {
console.log(err);
} else {
if (data.isFile()) {
fs.unlink(statData, (err) => {
if (err) {
console.log(err);
} else {
console.log("删除成功");
}
})
} else if (data.isDirectory()) {
deleteFiles(statData)
}
}
})
}
deleteFiles(filesName)
}
}
})
}
deleteFiles("./images")
思路:通过传入一个需要删除的文件夹路径,先使用NodeJs中的fs模块readdir()对文件夹进行读取,因为他是一个数组,所以先判断这个文件夹是否为空数组,如果为空数组,就删除该文件夹,如果不为空,就遍历这个文件夹,先判断是否为文件,如果是文件就删除文件,如果不是就再次执行函数,直到删除这个文件夹,我的步骤中缺点也比较明显,在遍历是会有很多代码冗余,因为遍历之后再次执行这个函数导致会再次遍历,但其实内容已经被删除了。
【node.js|nodeJS删除非空文件夹(通过递归和nodeJS对于文件和文件夹的相关操作)】老师代码
let fs = require("fs");
function deleFile(path, parentPath) {
if (fs.statSync(path).isDirectory()) {
let files = fs.readdirSync(path)
//files得到一个数组 ['01.jpg','02.png','tabbar','upload']
files.forEach((file, index) => {
let currentPath = path + "/" + file
//currentPath-->./images/01.jpg./images/02.png./images/tabbar./images/upload
if (fs.statSync(currentPath).isDirectory()) {
//如果条件为真 说明 currentPath是一个目录
deleFile(currentPath, path)
} else {
//currentPath说明是一个文件
fs.unlinkSync(currentPath)
}
})
if (path != parentPath) {
fs.rmdirSync(path)
}
} else {
fs.unlinkSync(path)
}
}deleFile("./images", "../day02")
其中使用了一些补充知识
let fs = require("fs");
fs.readFile("./a.txt", (err, data) => {
// console.log(data.toString());
console.log("a");
})
fs.readFile("./b.txt", (err, data) => {
console.log(data.toString());
console.log("b");
})console.log(fs.readFileSync("./a.txt").toString());
console.log(fs.readFileSync("./b.txt").toString());
// fs.readdir()异步的
// fs.readdirSync() //同步// fs.readFile()//异步
// fs.readFileSync() //同步
推荐阅读
- Node.js|Node.js fs模块(文件模块), 读取和写入 创建、删除(文件/文件夹)
- javascript|canvas核心内容
- vue|探索学习 Vue 组件篇 第四篇 组件的嵌套
- 前台vue|vue 实现多个视频播放 vue-video-player
- 前端|web学习笔记之JavaScript(一)
- 前端笔记|TypeScript基础
- java|自己的开源项目被尤雨溪写进演讲稿是一种什么体验()
- ui|element-ui 远程搜索组件el-select在项目中代码实现
- web前端学习|18.Vue组件化编程