forked from dreamerslab/node.rmdir
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrmdir.js
119 lines (94 loc) · 2.7 KB
/
rmdir.js
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
/*!
* rmdir
* Copyright(c) 2012 Ben Lin <[email protected]>
* MIT Licensed
*
* @fileoverview
* Remove all files in the given path recursively.
*/
var fs = require('fs');
function rmdir(dir, options, callback) {
if (typeof options === 'undefined') {
callback = function () {};
options = {};
}
if (typeof options === 'function') {
callback = options;
options = {};
}
var xfs = options.fs || fs;
xfs.lstat(dir, function (err, stat) {
var is_dir = stat && stat.isDirectory();
var _dir = is_dir ? dir + '/' : dir;
var _files = [];
var _dirs = [];
if (err) return callback(err, _dirs, _files);
if (!is_dir) {
return xfs.unlink(_dir, function (err) {
return err ? callback(err, _dirs, _files) : callback(null, _dirs, _files);
});
}
xfs.readdir(_dir, function (err, files) {
var pending;
if (err) return callback(err);
pending = files.length;
_dirs.push(_dir);
if (!pending) {
return xfs.rmdir(_dir, function (err) {
return err ? callback(err, _dirs, _files) : callback(null, _dirs, _files);
});
}
files.forEach(function (file) {
file = _dir + file;
xfs.lstat(file, function (err, stat) {
function rm_all_dirs(callback) {
if (!--pending) {
if (!_dirs.length) return callback();
var promises = _dirs.map(function (dir) {
return new Promise(function (resolve, reject) {
xfs.exists(dir, function (exists) {
if (!exists) return resolve();
xfs.rmdir(dir, function (err) {
if (err) return reject(err);
resolve();
});
});
});
});
Promise.all(promises)
.then(function () {
callback(null, _dirs, _files);
})
.catch(function (err) {
if (err) callback(err, _dirs, _files);
});
}
}
if (stat && stat.isDirectory()) {
_dirs.push(file);
rmdir(file, function (err, dirs, files) {
_files = _files.concat(files);
rm_all_dirs(callback);
});
return;
}
_files.push(file);
xfs.unlink(file, function (err) {
if (err) return callback(err);
rm_all_dirs(callback);
});
});
});
});
});
};
/**
* @public
*/
rmdir.version = JSON.parse(
fs.readFileSync(__dirname + '/../package.json', 'utf8')
).version;
/**
* Exports module.
*/
module.exports = rmdir;