情况是酱紫的:
比如我本地有一套文件目录:./build/test/css/i
此时我的文件资源管理器处于此套目录内的某一级目录
var fs = require('fs');
var f = require('./file');
f.del('./build');
这时在build文件夹中执行以上代码,会抛出如下异常:
fs.js:623
return binding.rmdir(pathModule._makeLong(path));
^
Error: ENOTEMPTY, directory not empty 'D:\Test\build\Test\css'
at Object.fs.rmdirSync (fs.js:623:18)
at Object.module.exports.del (D:\Test\file.js:99:10)
at D:\Test\file.js:93:22
at Array.forEach (native)
at Object.module.exports.del (D:\Test\file.js:91:11)
at D:\Test\file.js:93:22
at Array.forEach (native)
at Object.module.exports.del (D:\Test\file.js:91:11)
at Object.<anonymous> (D:\Test\change.js:4:3)
at Module._compile (module.js:456:26)
从错误异常来看,是因为某级目录不是空目录,所以无法删除。但是,我的f.del()
方法已经是递归删除了,只是在文件资源管理器处于其中的某一级目录时,才会删除不成功。
个人分析是因为当前要删除的文件夹被资源管理器占用着,所以会有某种权限上的问题。可是怎么解决呢,已经google多日也木有找到靠谱的解决方案,希望各位路过的大神儿能给看看,在此先行作辑了!!!
下面是f.del()
的源码:
del:function(source,callback){
var removedAll = true;
var source = f.realpath(source);
if(source){
if(f.isDir(source)){
var files;
try {
files = fs.readdirSync(source);
} catch (err) {
console.log(err);
}
files.forEach(function(name){
if(name != '.' && name != '..') {
removedAll = f.del(source + '/' + name) && removedAll;
}
});
if(removedAll) {
if(fs.existsSync(source)){
fs.rmdirSync(source);
}
if(callback) callback();
}
} else if(f.isFile(source)){
if (f.isWin && f.exists(source)) {
fs.chmodSync(source, 666);
}
fs.unlinkSync(source);
} else {
removedAll = false;
}
} else {
//
}
return removedAll;
}