Last active
May 13, 2020 15:58
-
-
Save yoavniran/adbbe12ddf7978e070c0 to your computer and use it in GitHub Desktop.
Node async & recursive dir remove
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
var path = require("path"), | |
fs = require("fs"); | |
module.exports = (function(){ | |
/** | |
* recursively remove the fs structure starting from (and including) the path given in dirToRemove | |
* @param dirToRemove | |
* the path to remove | |
* @param callback | |
* will be called when all operations are done successfully or when an error occurs | |
*/ | |
return function removeDir(dirToRemove, callback) { | |
var dirList = []; | |
var fileList = []; | |
function flattenDeleteLists(fsPath, callback) { | |
fs.lstat(fsPath, function (err, stats) { | |
if (err) { | |
callback(err); | |
return; | |
} | |
if (stats.isDirectory()) { | |
dirList.unshift(fsPath); //add to our list of dirs to delete after we're done exploring for files | |
fs.readdir(fsPath, function (err, files) { | |
if (err) { | |
callback(err); | |
return; | |
} | |
var currentTotal = files.length; | |
var checkCounter = function (err) { | |
if (currentTotal < 1 || err) { | |
callback(err); | |
} | |
}; | |
if (files.length > 0) { | |
files.forEach(function (f) { | |
flattenDeleteLists(path.join(fsPath, f), function (err) { | |
currentTotal -= 1; | |
checkCounter(err); | |
}); | |
}); | |
} | |
checkCounter(); //make sure we bubble the callbacks all the way out | |
}); | |
} | |
else { | |
fileList.unshift(fsPath); //add to our list of files to delete after we're done exploring for files | |
callback(); | |
} | |
}); | |
} | |
function removeItemsList(list, rmMethod, callback) { | |
var count = list.length; | |
if (count === 0){ | |
callback(); | |
return; | |
} | |
list.forEach(function (file) { | |
fs[rmMethod](file, function (err) { | |
count -= 1; | |
if (count < 1 || err) { | |
callback(err); | |
} | |
}); | |
}); | |
} | |
function onFinishedFlattening(err) { | |
if (err) { | |
callback(err); | |
return; | |
} | |
removeItemsList(fileList, "unlink", function (err) {//done exploring folders without errors | |
if (err) { | |
callback(err); | |
return; | |
} | |
removeItemsList(dirList, "rmdir", function (err) { //done deleting files without errors | |
callback(err); //done | |
}); | |
}); | |
} | |
flattenDeleteLists(dirToRemove, onFinishedFlattening); | |
}; | |
})(); |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var removeDir = require("./node-remove-dir"); | |
var startTime = Date.now(); | |
removeDir("/tmp/test1", function (err) { | |
console.log("finished! in " + (Date.now() - startTime) + " ms - ", err); | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
you must delete dirs after all files deleted.
you may attempt to delete a dir before deleting it's content.