解决ENOTEMPTY: directory not empty, rename

28 min read

问题描述:

当我们使用fs.rename()方法重命名一个目录时,如果目录非空,将会抛出 ENOTEMPTY: directory not empty, rename 错误。

原因分析:

这个错误是因为文件系统在试图重命名一个非空目录时,会发现目录里面还有其他文件或目录存在,所以会拒绝执行目录重命名操作。这是一种保护机制,可以避免意外删除目录中的内容。

解决方法:

为了解决这个问题,我们需要先清空目标目录,然后再执行重命名操作。

可以使用以下代码清空目录:

const fs = require('fs');
const path = require('path');

function emptyDir(dirPath) {
  if (!fs.existsSync(dirPath)) {
    return;
  }

  const files = fs.readdirSync(dirPath);

  files.forEach(file => {
    const filePath = path.join(dirPath, file);

    if (fs.statSync(filePath).isDirectory()) {
      emptyDir(filePath);
      fs.rmdirSync(filePath);
    } else {
      fs.unlinkSync(filePath);
    }
  });
}

上面的代码使用了递归的方式遍历目录中的所有子目录和文件,并删除它们。如果目录不存在,该函数将不进行任何操作。

一旦目录被清空,我们就可以安全地执行重命名操作了:

const fs = require('fs');
const path = require('path');

const oldPath = '/path/to/old/dir';
const newPath = '/path/to/new/dir';

// 清空目标目录
emptyDir(newPath);

// 执行重命名操作
fs.renameSync(oldPath, newPath);

以上是Node.js的同步方式,也可以使用异步方式 fs.rename()fs.readdir() 完成。