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,並且呼叫callback
if (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 = null
let index = 0
while(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]
//如果為空,說明檔案刪除完畢,呼叫callback
if (!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()) { // recurse
deleteFolderRecursive(curPath);
} else { // delete file
fs.unlinkSync(curPath);
}
});
fs.rmdirSync(path);
}
};
相關推薦
Node.js fs模組 刪除非空目錄
這裡主要是進一步使用其他方法刪除目錄,提高自己對fs模組提供的api的熟悉度非同步刪除(深度模式)核心思想就是遍歷完成某一個目錄以後,在遍歷另外一個目錄,最後開始冒泡刪除const fs = requi
Node.js FS模組方法速查
1. File System 所有檔案操作提供同步和非同步的兩種方式,本筆記只記錄非同步的API 非同步方式其最後一個引數是回撥函式。回撥函式的第一個引數往往是錯誤物件,如果沒有發生引數,那麼第一個引數可能是null或者undefinded。 同步函式可以使用try
Node.Js fs模組資料夾操作
1.fs.readdir(path, callback); 使用fs.readdir讀取目錄,重點其回撥函式中files物件 /** * path, 要讀取目錄的完整路徑及目錄名; * [callback(err, files)], 讀完目錄回撥函式;err錯誤物件,f
Node.js——fs檔案模組
//檔案模組 核心模組,所以直接用require匯入就行 var fs=require("fs"); //檔案操作:讀 //檔案路徑 開啟的方式(讀 r / 寫 w) [許可權]-可有可無
Node.js fs檔案系統模組
一、讀取檔案幾個步驟 1.先引入fs檔案系統模組 2.使用readfile 或 readFileSync 注意點:它們的回撥函式有兩個引數,第一個是err,第二個是data,得到的data是buffer檔案,必須通過toString()方法轉換一下 const fs = require('fs'
Linux刪除非空目錄
mdi 時間 比較 軟件管理器 之前 .aspx 軟件包管理器 stp 進程 Linux下如何刪除非空目錄 這個問題很basic,不過還是困擾了我一段時間.(這裏主要討論的是命令行模式下)我本來覺得應該使用命令 rmdir但是發現它無法刪除非空的目錄.後來發現了原來應
java使用遞歸刪除非空目錄
args 使用遞歸 efi 得到 list() 刪除 .get pan class 使用遞歸刪除非空目錄 目錄的創建: file.makdir(); 空目錄的刪除: file.delete(); 例一、 package file; import java.io.File
瞭解Node.js的模組、包、包管理器
一、模組 1.一個Node.js檔案就是一個模組,這個檔案可能 是JavaScript程式碼、JSON或者編譯過的C/C++擴充套件。 2.Node.js提供了exports和require兩個物件,其中exports是模組公開的介面,require用於從外部獲取一個模組的介面,即所獲取
php刪除非空目錄程式碼實現
<?php header("Content-type: text/html; charset=utf-8"); $dir='mydir'; function deldir($dir){ if(file_exists($dir)){ $files=sca
php刪除非空目錄代碼實現
can urn false 遞歸函數 turn content ext file set <?php header("Content-type: text/html; charset=utf-8"); $dir=‘mydir‘; function d
Node JS http模組
前言 本人所發的NodeJS系列學習筆記參考了一些書籍、官方文件以及一些前輩的程式碼及註釋,可能有些地方理解的不對。如果有誤,歡迎到我的github上提出。當然,希望可以點個星星。 node-http Node.js提供了http模組,用於搭建HTTP服務端和客戶端。 建立Web伺服
php遞迴刪除非空目錄
&nbs
node.js-fs
簡介 fs 模組是node.js中的檔案操作模組。 匯入 const fs = require('fs'); 非同步 fs.readFile('file.txt', function(err, data){ if(err){
Node.js_2.包、NPM、Node.js核心模組
包、NPM、Node.js核心模組 1 包和NPM 1.1 包 1.1.1 CommonJS規範 1.1.2 包 1.1.3 包的結構 1.2 NPM(node packa
Node.js-檔案模組之其他操作
9. 其他操作 (1)絕對路徑 Fs.realpath() Fs.realpathSync() 例子: // 匯入檔案系統 const fs = require('fs'); fs.realpa
Node.js-核心模組querystring
3. querystring querystring.escape() ---編碼 Querystring.unescape() ---escape的逆運算 Query
Node中fs模組 API詳解
fs 概述 在 NodeJS 中,所有與檔案操作都是通過 fs 核心模組來實現的,包括檔案目錄的建立、刪除、查詢以及檔案的讀取和寫入,在 fs 模組中,所有的方法都分為同步和非同步兩種實現,具有 sync 字尾的方法為同步方法,不具有 sync 字尾的方法為非同步方法,在瞭
Node.js readline模組與util模組的用法
本篇文章主要介紹了Node.js readline模組與util模組的使用,寫的十分的全面細緻,具有一定的參考價值,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。 #1. 使用readline模組逐行讀取流資料 1.1. 建立Interface物件 在re
使用HTTPS保障HTTP伺服器的安全性-使用Node.js HTTPS模組建立HTTPS伺服器
這篇文章是下面部落格的進一步搭建HTTPS server的部落格 // angular nodejs express mongodb apache,模擬線上部署(HTTP server) https://blog.csdn.net/liangxw1/arti
node.js核心模組
node為javaScript提供了很多伺服器級別的API,這些api絕大多數都被包裝到了一個具名的核心模組中了。例如檔案操作的fs核心模組,http服務構建的http模組,path路徑操作模組,os作業系統資訊模組。。常用不超過5個 使用核心模組,必須使用require,並且變數名最好也叫模組