1. 程式人生 > >Node.js 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,並且呼叫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

Nodefs模組 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,並且變數名最好也叫模組