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请使用不带-rfrm,这样您就无法强制删除。希望对您有所帮助。

您可以让它递归工作。像这样:

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请使用不带-rfrm,这样您就无法强制删除。希望有帮助。

序言

这个答案是对公认答案的补充
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上。