-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathremoveTree.js
116 lines (110 loc) · 3.02 KB
/
removeTree.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
var sas = require('sas');
var fs = require('fs');
var path = require('path');
function removeTree(dir, opts, callback) {
dir = path.resolve(dir); //根目录.
var deep = 0; //深度计数
var errCount = 0; //未能删除文件数
if(typeof opts === 'function') {
callback = opts;
opts = {};
}else{
callback = callback || function(){}
}
var sasProcessLog = opts.process;
opts.onFail = opts.onFail || function(){}
function _errHandle(name, err){
opts.onFail(name, err);
errCount = errCount + 1;
}
function _rmdir(fspath) {
return function(cb) {
fs.rmdir(fspath, function(err, result) {
if (err) {
_errHandle('rmdir', err);
}
cb();
})
}
}
function read_dir(cb, t) {
var t_fspath = t.fspath(); //t.fspath()=返回过滤掉t.path里数字的一个新数组。
var fspath = t_fspath.join('') ? dir + t_fspath.join('') : dir;
if (t_fspath.length > deep) {
deep = t_fspath.length; //记录最深点
}
fs.readdir(fspath, function(err, files) {
if (err) { //一些奇怪的文件夹
_errHandle('readdir', err);
return cb("$STOP", err);
}
var len = files.length;
if (len) {
var obj = {};
for (var i = 0; i < len; i++) {
var file = files[i];
obj['/' + file] = fspath + '/' + file; //防止跟保留字冲突,前面加 '/';
}
t.push(obj); //添加任务
}
t.push(_rmdir(fspath)); //添加任务
cb();
});
}
function _stat(fspath) { //iterator
return function(cb) {
fs.lstat(fspath, function(err, stat) {
if (err) { //一些奇怪的文件
_errHandle('lstat', err);
return cb();
}
/* if (stat.isSymbolicLink()) { //链接
return cb();
}*/
if (stat.isDirectory()) {
return cb('$RELOAD', [read_dir]);
} else {
fs.unlink(fspath, function(err, result) {
if (err) {
_errHandle('unlink', err);
}
cb();
});
}
});
}
}
var time = Date.now();
sas(dir, {
iterator: _stat,
process: sasProcessLog,
allEnd: function(err) {
if (err) {
return callback(err);
} else {
callback(null, {
errCount: errCount,
deep:deep
});
}
}
});
}
//test
// removeTree('D:/duwei/git/sas/demo/data/mkTree', {processLog: true}, function(err, result) {
// if (err) {
// console.error('\n删除失败');
// } else {
// var msg = '\n';
// var errCount = result.errCount;
// if(errCount){
// msg += '结束, 共有\u001b[91m' + errCount + '\u001b[39m个文件删除失败,请关闭其它可能占用该文件夹的程序再试.\n';
// }else{
// msg += '删除成功。';
// }
// msg += '最深达 \u001b[96m' + result.deep + '\u001b[39m 层.用时:' + result.timeCount + 'ms';
// console.log(msg);
// }
// //process.stdin.end();
// });
module.exports = removeTree;