一个关于node删除本地文件夹报错的问题
发布于 4个月前 作者 chenxiaochun 374 次浏览 来自 问答

情况是酱紫的: 比如我本地有一套文件目录:./build/test/css/i此时我的文件资源管理器处于此套目录内的某一级目录 TimLine截图20141024093532.png

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;
}
回到顶部