国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > JS > 正文

node中實現刪除目錄的幾種方法

2024-05-06 16:52:38
字體:
來源:轉載
供稿:網友

由于刪除目錄只能刪除空目錄(如果有子文件或文件夾要先刪除)

目錄結構算是典型的二叉樹模型,所以涉及到遍歷樹結構

二叉樹遍歷(分為深度和廣度,以及先序,中序,后序之分)

以下以深度先序解決目錄刪除

在node中由于主線程為單線程, 可以采取串行方式和并行方式

無論用什么方法刪除,就一點核心: 如果是文件直接刪除, 如果不是就刪除所有子文件或子目錄, 然后記得(一定記得刪除自己)

深度先序(串行)

深度先序(串行 回調方式)

const fs = require('fs')const path = require('path')function rmdir(filePath, callback) {  // 先判斷當前filePath的類型(文件還是文件夾,如果是文件直接刪除, 如果是文件夾, 去取當前文件夾下的內容, 拿到每一個遞歸)  fs.stat(filePath, function(err, stat) {    if(err) return console.log(err)    if(stat.isFile()) {      fs.unlink(filePath, callback)    }else {      fs.readdir(filePath, function(err, data) {        if(err) return console.log(err)        let dirs = data.map(dir => path.join(filePath, dir))        let index = 0        !(function next() {          // 此處遞歸刪除掉所有子文件 后刪除當前 文件夾          if(index === dirs.length) {            fs.rmdir(filePath, callback)          }else {            rmdir(dirs[index++],next)          }        })()      })    }  })}rmdir('a', function() {  console.log('刪除成功')})

深度先序 (串行 promise寫法)

const fs = require('fs')const path = require('path')function rmdirPromise(filePath) {  return new Promise((resolve, reject) => {    fs.stat(filePath, function(err, stat) {      if(err) reject(err)      if(stat.isFile()) {        fs.unlink(filePath, function(err) {          if(err) reject(err)          resolve()        })      }else {        fs.readdir(filePath, function(err, dirs) {          if(err) reject(err)          dirs = dirs.map(dir => path.join(filePath, dir)) // a/b a/c          let index = 0;          (function next() {            if(index === dirs.length) {              fs.rmdir(filePath, function(err) {                if(err) reject(err)                resolve()              })            }else {              rmdirPromise(dirs[index++]).then(() => {                next()              }, err => {                reject(err)              })            }          })()        })      }    })  })}rmdirPromise('a').then(() => {  console.log('刪除成功')})

深度先序 (串行 async await寫法)

// 在node v10.0.0+版本中fs模塊提供 promise 寫法 const fs = require('fs').promises// 如果在node 10之前的版本中可以引入第三方模塊 mz const fs = require('mz/fs') 用法一致 https://www.npmjs.com/package/mzconst fs = require('fs').promisesconst path = require('path')async function rmdirAsync(filePath) {  let stat = await fs.stat(filePath)  if (stat.isFile()) {    await fs.unlink(filePath)  } else {    let dirs = await fs.readdir(filePath)    dirs = dirs.map(dir => path.join(filePath, dir))    let index = 0;    (async function next() {      if (index === dirs.length) {        await fs.rmdir(filePath)      } else {        await rmdirAsync(dirs[index++])        await next()      }    })()  }}rmdirAsync('a').then(() => {  console.log('刪除成功')}, (err) => {  console.log('err', err)})

深度先序 (并行)

深度先序 (并行 回調寫法)

const fs = require('fs').promisesconst path = require('path')function rmdir(filePath, callback) {  fs.stat(filePath, function(err,stat) {    if(err) return console.log(err)    if(stat.isFile()) {      fs.unlink(filePath, callback)    }else {      fs.readdir(filePath, function(err, dirs) {        if(err) return console.log(err)        // 此處要添加dirs.length的驗證,不然如果length為0 后面的forEach不執行, 就刪不掉當前目錄了, 也執行不了callback        if(dirs.length === 0) {          fs.rmdir(filePath, callback)        }        dirs = dirs.map(dir => path.join(filePath, dir))        // 通過計數的方式來判斷是否子目錄都刪除了        let index = 0        function done() {          if(++index === dirs.length) {            fs.rmdir(filePath, callback)          }        }        // 何為并行? a下有兩個目錄b, c,那么同時將b, c的刪除都推到event Loop中,用for循環實現        dirs.forEach(dir => {          // 通過done回調的方式來控制js執行流程(LazyMan問題也是這么解決的)          rmdir(dir, done)        });      })    }  })}rmdir('a', function() {  console.log('刪除成功')})

深度先行 (并行promise寫法)

const fs = reqire('fs')const path = require('path')function rmdirPromise(filePath) {  return new Promise((resolve, reject) => {    fs.stat(filePath, function (err, stat) {      if (err) reject(err)      if (stat.isFile()) {        fs.unlink(filePath, function (err) {          if (err) reject(err)          resolve()        })      } else {        fs.readdir(filePath, function (err, dirs) {          if (err) reject(err)          dirs = dirs.map(dir => path.join(filePath, dir))          dirs = dirs.map(dir => rmdirPromise(dir))          Promise.all(dirs).then(() => {            fs.rmdir(filePath, resolve)          })        })      }    })  })}rmdirPromise('a').then(() => {  console.log('刪除成功')})

深度先序 (并行 async + await寫法)

const fs = require('fs').promisesconst path = require('path')async function rmdirAsync(filePath) {  let stat = await fs.stat(filePath)  if(stat.isFile()) {    await fs.unlink(filePath)  }else {    let dirs = await fs.readdir(filePath)    dirs = dirs.map(dir => rmdirAsync(path.join(filePath, dir)))    await Promise.all(dirs)    await fs.rmdir(filePath)  }}rmdirAsync('a').then(() => {  console.log('刪除成功')})

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 荔波县| 新源县| 黑龙江省| 富蕴县| 宽甸| 绥德县| 清徐县| 元朗区| 平湖市| 江源县| 柘城县| 大埔县| 迁安市| 施秉县| 邵东县| 汝阳县| 凤山县| 涪陵区| 郯城县| 浦江县| 南郑县| 满洲里市| 长宁县| 闸北区| 广南县| 游戏| 洪雅县| 磐安县| 南康市| 古丈县| 读书| 永平县| 富源县| 长汀县| 左云县| 镇赉县| 名山县| 东乡县| 台北市| 宜丰县| 宁夏|