Node.js fs模块 删除非空目录
这里主要是进一步使用其他方法删除目录,提高自己对fs模块提供的api的熟悉度
异步删除(深度模式)
核心思想就是遍历完成某一个目录以后,在遍历另外一个目录,最后开始冒泡删除
const fs = require('fs')
const path = require('path')/**** @desc 异步深度循环删除目录* @param {string} dir 需要删除的目录* @param {function} callback 回调函数** 实现思路:* 1.读取文件目录拿到当前目录所有的files* 2.调用next方法,并从0开始遍历files* 3.遍历结束,调用callbanck*/
function rmdir (dir, callback) {fs.readdir(dir, (err, files) => {/*** @desc 内部循环遍历使用的工具函数* @param {Number} index 表示读取files的下标*/function next(index) {// 如果index 等于当前files的时候说明循环遍历已经完毕,可以删除dir,并且调用callbackif (index == files.length) return fs.rmdir(dir, callback)// 如果文件还没有遍历结束的话,继续拼接新路径,使用fs.stat读取该路径let newPath = path.join(dir, files[index])// 读取文件,判断是文件还是文件目录fs.stat(newPath, (err, stat) => {if (stat.isDirectory() ) {// 因为我们这里是深度循环,也就是说遍历玩files[index]的目录以后,才会去遍历files[index+1]// 所以在这里直接继续调用rmdir,然后把循环下一个文件的调用放在当前调用的callback中rmdir(newPath, () => next(index+1))} else {// 如果是文件,则直接删除该文件,然后在回调函数中调用遍历nextf方法,并且index+1传进去fs.unlink(newPath, () => next(index+1))}})}next(0)
})
}rmdir('a', () => {console.log('文件删除完毕')})
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
同步删除目录(广度模式)
核心思想:遍历目录,把所有的路径都放入一个程序池,然后循环删除所有文件
/*** 广度遍历删除文件*/
const fs = require('fs')
const path = require('path')
/*** @desc 同步广度删除* @param {string} dir 需要删除的目录** 实现思路* 1.创建需要的变量,arr=> 保存所有的路径的文件池 current => 当前遍历到的路径 index => 记录比遍历的下标* 2.使用while循环,拿到所有的路径* 3.使用fs.stat判断,如果当前路径是一个目录,使用fs.readdirSync 读取所有文件内容,* 4.使用map函数映射files路经(拼接当前遍历到的carrent和file),* 5.添加到文件池中去*/
function rmdir(dir) {let arr = [dir]let current = nulllet index = 0while(current = arr[index++]) {// 读取当前文件,并做一个判断,文件目录分别处理let stat = fs.statSync(current)//如果文件是目录if (stat.isDirectory()) {//读取当前目录,拿到所有文件let files = fs.readdirSync(current)// 将文件添加到文件池arr = [...arr, ...files.map(file => path.join(current, file))]}}//遍历删除文件for (var i = arr.length - 1; i >= 0; i--) {// 读取当前文件,并做一个判断,文件目录分别处理let stat = fs.statSync(arr[i])// 目录和文件的删除方法不同if (stat.isDirectory()) {fs.rmdirSync(arr[i])} else {fs.unlinkSync(arr[i])}}
}rmdir('a')
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
广度删除(异步调用)
实现思路和同步模式一样,只是讲调用方式改成了异步
/*** 广度遍历删除文件 异步删除文件*/
const fs = require('fs')
const path = require('path')/*** @desc 广度遍历删除文件目录* @param {String} 需要删除的目录* @param {FUnction} 任务完成以后执行的回调函数* * 实现思路:* 1.创建文件池(arr),创建一个current对象,遍历的时候使用* 2.创建一个next方法,遍历查找文件和读取文件目录使用* 3.创建一个rm方法,主要用来删除文件*/
function rmdir (dir, callback) {var arr = [dir] //文件池,保存所有的文件var current = null //遍历文件的时候保存临时文件/*** * @param {Number} index 表示遍历文件池的下标 */function next (index) {current = arr[index] //拿到当前遍历的值if (!current) return rm(index-1) //判断是否为空,为空的话说明已经遍历结束,开始删除文件//遍历删除所有文件和目录//读取文件,对文件和文件目录进行不同的操作fs.stat(current, (err, stat) => {if (stat.isDirectory()) {//如果是文件目录就读取文件目录的内容fs.readdir(current, (err, files) => {//映射出新的路径,然后添加到文件池var temp = files.map( file => path.join(current, file))arr = [...arr, ...temp]//遍历文件池下一个文件next(index+1)})} else {//如果是文件,则直接遍历文件池下一个文件next(index+1)}})/*** @desc 删除目录方法* @param {Number} index 需要删除的文件的标,* * 实现思路:* 1.通过index拿到当前需要删除的文件[文件目录],判断是否为空,为空就直接清空文件池,调用callback* 2.如果不为空,则使用fs.stat读取文件,查看是文件还是文件目录,* 3.调用不同的方法删除该文件,并且调用自身,index在-1以后传入* */function rm (index) {current = arr[index]//如果为空,说明文件删除完毕,调用callbackif (!current) {arr = null;return callback && callback()}//如果文件不为空,则读取文件类型,然后调用不同的方法删除文件[文件目录]fs.stat(current, (err, stat) => {if (stat.isDirectory()) {fs.rmdir(current, err => rm(index-1))} else {fs.unlink(current, err => rm(index-1))}})}}//第一次开始遍历文件目录next(0)
}
rmdir('a', ()=>{console.log('文件删除完毕')})
递归同步方法
function deleteFolderRecursive(path) {if( fs.existsSync(path) ) {fs.readdirSync(path).forEach(function(file) {var curPath = path + "/" + file;if(fs.statSync(curPath).isDirectory()) { // recursedeleteFolderRecursive(curPath);} else { // delete filefs.unlinkSync(curPath);}});fs.rmdirSync(path);}
};
Node.js fs模块 删除非空目录相关推荐
- node.js fs模块_Node.js中的fs模块简介
node.js fs模块 fs, short for File System, is one of the most basic and useful modules in Node. In this ...
- node.js中模块_在Node.js中需要模块:您需要知道的一切
node.js中模块 by Samer Buna 通过Samer Buna 在Node.js中需要模块:您需要知道的一切 (Requiring modules in Node.js: Everythi ...
- 模块加载及第三方包:Node.js模块化开发、系统模块、第三方模块、package.json文件、Node.js中模块的加载机制、开发环境与生产环境、cookie与session
1.Node.js模块化开发 1.1 JavaScript开发弊端 JavaScript 在使用时存在两大问题,文件依赖和命名冲突. 1.2 软件中的模块化开发 一个功能就是一个模块,多个模块可以组成 ...
- Node.js Web 模块
Node.js Web 模块 什么是 Web 服务器? Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,Web服务器的基本功能就是提供Web信息浏览服务.它只需支持HTTP协议. ...
- Node.js Domain 模块
Node.js 工具模块 Node.js Domain(域) 简化异步代码的异常处理,可以捕捉处理try catch无法捕捉的异常.引入 Domain 模块 语法格式如下: var domain = ...
- Node.js:模块查找,引用及缓存机制
1. Node.js的模块载入方式与机制 Node.js中模块可以通过文件路径或名字获取模块的引用.模块的引用会映射到一个js文件路径,除非它是一个Node内置模块.Node的内置模块公开了一些常用的 ...
- Node.js: fs.readFile/writeFile 和 fs.createReadStream/writeStream 区别
1. 先说说各自的用法: How do I read files in node.js? fs = require('fs'); fs.readFile(file, [encoding], [call ...
- Node.js Web 模块(客户端 服务端实例)
Node.js Web 模块 Web 应用架构 Client - 客户端,一般指浏览器,浏览器可以通过 HTTP 协议向服务器请求数据. Server - 服务端,一般指 Web 服务器,可以接收客户 ...
- Node.js文件系统模块——读写文件操作
文章目录 前言 一.导入fs模块 1.readFile() && readFileSync() 2.writeFile() && writeFileSync() 3.a ...
最新文章
- R语言-包的安装、载入及使用方法
- 【推导】计蒜客17119 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F. Trig Function
- html正则表达式确认密码,如何使用正则表达式在流星中验证确认密码
- SAP的模块化服务应用市场Hybris,前景如何?
- 基于 abp vNext 和 .NET Core 开发博客项目 - 使用 abp cli 搭建项目
- 计组(唐朔飞)第一章自我总结
- redis集群3种模式
- 如何在Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作...
- Flume-概述-安装
- 双系统中ubuntu的安装方法
- 中国地图分省设色地图竖版高清矢量cdr、pdf格式2020年
- 软件测试结束的标准是什么??
- 阅读材料:信息技术年谱
- 【机器学习】【可解释性】LIME
- IE6 PNG 图片问题分析
- 基于主成分分析的人脸识别及表情识别
- libzip解压缩方法分析
- select2的使用
- 网页期末作业制作一个简单HTML电影网页设计(HTML+CSS)
- vue3父组件调用子组件的方法
热门文章
- html读秒倒计时,使用javascript做时间倒数读秒功能的实例
- CVE-2020-1967: openssl 拒绝服务漏洞通告
- cmnet是什么 cmnet是什么意思?cmnet和cmwap的区别在哪里
- “不安分”的花椒直播,搞了史上首个网红演唱会
- 遇到的那些奇奇怪怪的文件格式(持续更新。。。)
- Android Studio 使用中 遇到的那些奇奇怪怪的问题
- PostgreSQL数据库自带的命令行工具--psql
- Java之类和对象(超超超详解)
- 搜狐邮箱打开第三方邮件客户端登录功能及设置独立密码方法
- 安卓 jni 开发 —— Android Studio 打包 so 的坑