Javascript 错误:";EPERM:不允许操作“;而删除目录不是emty
Javascript 错误:";EPERM:不允许操作“;而删除目录不是emty,javascript,node.js,Javascript,Node.js,我正在尝试删除Nodejs文件系统中不为空的文件夹。已删除根文件夹中的所有文件夹,但未删除根文件夹。我用空文件夹再试一次,成功了 const rmDir = (dirPath) => { try { var files = fs.readdirSync(dirPath); } catch(e) { return; } if (files.length > 0) for (var i = 0; i < files.length; i++) { v
我正在尝试删除Nodejs文件系统中不为空的文件夹。已删除根文件夹中的所有文件夹,但未删除根文件夹。我用空文件夹再试一次,成功了
const rmDir = (dirPath) => {
try { var files = fs.readdirSync(dirPath); }
catch(e) { return; }
if (files.length > 0)
for (var i = 0; i < files.length; i++) {
var filePath = dirPath + '/' + files[i];
if (fs.statSync(filePath).isFile())
fs.unlinkSync(filePath);
else
rmDir(filePath);
}
fs.rmdirSync(dirPath);
return true;
}
你可以让它递归地工作。像这样:
var fs = require('fs');
var deleteFolderRecursive = function(path) {
if (fs.existsSync(path)) {
fs.readdirSync(path).forEach(function(file, index){
var curPath = path + "/" + file;
if (fs.lstatSync(curPath).isDirectory()) { // recurse
deleteFolderRecursive(curPath);
} else { // delete file
fs.unlinkSync(curPath);
}
});
fs.rmdirSync(path);
}
};
或者你也可以试试
fs使用shell命令。要删除文件夹fs请使用不带-rf的rm,这样您就无法强制删除。希望对您有所帮助。您可以让它递归工作。像这样:
var fs = require('fs');
var deleteFolderRecursive = function(path) {
if (fs.existsSync(path)) {
fs.readdirSync(path).forEach(function(file, index){
var curPath = path + "/" + file;
if (fs.lstatSync(curPath).isDirectory()) { // recurse
deleteFolderRecursive(curPath);
} else { // delete file
fs.unlinkSync(curPath);
}
});
fs.rmdirSync(path);
}
};
或者你也可以试试
fs使用shell命令。要删除文件夹fs请使用不带-rf的rm,这样您就无法强制删除。希望有帮助。序言 这个答案是对公认答案的补充
EPERM
(请参阅)错误代码也可能是由于未链接路径下的文件仍在使用而导致的。我在使用Mocha进行单元测试后设置清理过程时遇到了这个问题
问题
使用unlink()
或unlinkSync()
解除文件链接可能无法在Windows上按预期工作,因为文件实际上并未被删除,但基本上会在释放所有文件句柄后将其标记为删除(请参阅相关内容)
因此,例如,尽管unlinkSync()
成功地“删除”了文件,但当rmdirSync()
到达包含文件夹时,它可能会失败,因为从文件系统的角度来看,文件仍然存在
如果文件正在被您不控制的进程使用,除了轮询文件是否可用(请参阅),您没有什么可以做的,但是如果您只需要执行清理-在退出进程之前生成子进程,请执行以下操作:
//parent process
const { spawn } = require('child_process');
/**
* @summary Spawns completely detached child
* @param {NodeJS.Process} parent
* @param {string} path
* @param {object} env
* @return {NodeJS.Process}
*/
const spawnResponsible = (parent, path, env) => {
const child = spawn(parent.argv0, [path], {
env,
detached: true,
stdio: "ignore"
});
child.unref();
return child;
};
process.once('beforeExit', () => {
spawnResponsible(
process,
'path to your child process script file',
{ PATHS: [] } //array of paths
);
});
您的子进程可能如下所示(请注意,不建议使用同步方法,除非您正在进行设置或清理,并且在没有[使用子进程部分解决问题,但以运行其他进程为代价]的情况下无法继续]:
参考资料
unlinkSync()
spawn()
rmdirSync()
序言 这个答案是对公认答案的补充
EPERM
(请参阅)错误代码也可能是由于未链接路径下的文件仍在使用而导致的。我在使用Mocha进行单元测试后设置清理过程时遇到了这个问题
问题
使用unlink()
或unlinkSync()
解除文件链接可能无法在Windows上按预期工作,因为文件实际上并未被删除,但基本上会在释放所有文件句柄后将其标记为删除(请参阅相关内容)
因此,例如,尽管unlinkSync()
成功地“删除”了文件,但当rmdirSync()
到达包含文件夹时,它可能会失败,因为从文件系统的角度来看,文件仍然存在
如果文件正在被您不控制的进程使用,除了轮询文件是否可用(请参阅),您没有什么可以做的,但是如果您只需要执行清理-在退出进程之前生成子进程,请执行以下操作:
//parent process
const { spawn } = require('child_process');
/**
* @summary Spawns completely detached child
* @param {NodeJS.Process} parent
* @param {string} path
* @param {object} env
* @return {NodeJS.Process}
*/
const spawnResponsible = (parent, path, env) => {
const child = spawn(parent.argv0, [path], {
env,
detached: true,
stdio: "ignore"
});
child.unref();
return child;
};
process.once('beforeExit', () => {
spawnResponsible(
process,
'path to your child process script file',
{ PATHS: [] } //array of paths
);
});
您的子进程可能如下所示(请注意,不建议使用同步方法,除非您正在进行设置或清理,并且在没有[使用子进程部分解决问题,但以运行其他进程为代价]的情况下无法继续]:
参考资料
unlinkSync()
spawn()
rmdirSync()
错误:EPERM:不允许操作,你在mac/ubuntu/linux上吗?我在Windows上。错误:EPERM:不允许操作,你在mac/ubuntu/linux上吗?我在Windows上。