Node.js fs模块 删除非空目录

2024-04-02 04:58
文章标签 模块 js 删除 node fs 空目录

本文主要是介绍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模块 删除非空目录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869030

相关文章

Python列表的创建与删除的操作指南

《Python列表的创建与删除的操作指南》列表(list)是Python中最常用、最灵活的内置数据结构之一,它支持动态扩容、混合类型、嵌套结构,几乎无处不在,但你真的会创建和删除列表吗,本文给大家介绍... 目录一、前言二、列表的创建方式1. 字面量语法(最常用)2. 使用list()构造器3. 列表推导式

MyBatis-Plus逻辑删除实现过程

《MyBatis-Plus逻辑删除实现过程》本文介绍了MyBatis-Plus如何实现逻辑删除功能,包括自动填充字段、配置与实现步骤、常见应用场景,并展示了如何使用remove方法进行逻辑删除,逻辑删... 目录1. 逻辑删除的必要性编程1.1 逻辑删除的定义1.2 逻辑删php除的优点1.3 适用场景2.

C#实现插入与删除Word文档目录的完整指南

《C#实现插入与删除Word文档目录的完整指南》在日常的办公自动化或文档处理场景中,Word文档的目录扮演着至关重要的角色,本文将深入探讨如何利用强大的第三方库Spire.Docfor.NET,在C#... 目录Spire.Doc for .NET 库:Word 文档处理利器自动化生成:C# 插入 Word

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

使用Python实现在PDF中添加、导入、复制、移动与删除页面

《使用Python实现在PDF中添加、导入、复制、移动与删除页面》在日常办公和自动化任务中,我们经常需要对PDF文件进行页面级的编辑,使用Python,你可以轻松实现这些操作,而无需依赖AdobeAc... 目录1. 向 PDF 添加空白页2. 从另一个 PDF 导入页面3. 删除 PDF 中的页面4. 在

Python AST 模块实战演示

《PythonAST模块实战演示》Python的ast模块提供了一种处理Python代码的强大工具,通过解析代码生成抽象语法树(AST),可以进行代码分析、修改和生成,接下来通过本文给大家介绍Py... 目录 什么是抽象语法树(AST)️ ast 模块的核心用法1. 解析代码生成 AST2. 查看 AST

Java轻松实现在Excel中插入、提取或删除文本框

《Java轻松实现在Excel中插入、提取或删除文本框》在日常的Java开发中,我们经常需要与Excel文件打交道,当涉及到Excel中的文本框时,许多开发者可能会感到棘手,下面我们就来看看如何使用J... 目录Java操作Excel文本框的实战指南1. 插入Excel文本框2. 提取Excel文本框内容3

关于MySQL将表中数据删除后多久空间会被释放出来

《关于MySQL将表中数据删除后多久空间会被释放出来》MySQL删除数据后,空间不会立即释放给操作系统,而是会被标记为“可重用”,以供未来插入新数据时使用,只有满足特定条件时,空间才可能真正返还给操作... 目录一、mysql数据删除与空间管理1.1 理解MySQL数据删除原理1.3 执行SQL1.3 使用

Qt实现删除布局与布局切换功能

《Qt实现删除布局与布局切换功能》在Qt应用开发中,动态管理布局是一个常见需求,比如根据用户操作动态删除某个布局,或在不同布局间进行切换,本文将详细介绍如何实现这些功能,并通过完整示例展示具体操作,需... 目录一、Qt动态删除布局1. 布局删除的注意事项2. 动态删除布局的实现步骤示例:删除vboxLay

Redis中删除策略的几种实现方式

《Redis中删除策略的几种实现方式》本文详细介绍了Redis的过期键删除策略和内存淘汰策略,过期键删除策略包括定时删除、惰性删除和定期删除,具有一定的参考价值,感兴趣的可以了解一下... 目录前言一、设计背景:为什么需要删除策略?二、第一类:过期键的 3 种核心删除策略1. 定时删除(Timed Dele