一个关于node删除本地文件夹报错的问题
发布于 10 年前 作者 chenxiaochun 10038 次浏览 最后一次编辑是 8 年前 来自 问答

情况是酱紫的: 比如我本地有一套文件目录:./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;
}
1 回复

我也遇到了,递归删除不成功,明明是空的,但就是显示说文件夹不是空

回到顶部