You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js中fs.rm递归删除目录抛出ENOTEMPTY错误求助

解决fs.rm递归删除目录时的ENOTEMPTY错误

问题说明

出现问题的代码如下:

import { existsSync } from "fs";
import fs from "fs/promises";

export async function makeFolder(path: string) {
if (existsSync(path)) {
try {
await fs.rm(path, { recursive: true, force: true });
} catch (e) {
console.log("ERROR", e);
}
}
await fs.mkdir(path, { recursive: true });
}

执行这段代码删除dist/resources目录时,会抛出ENOTEMPTY: directory not empty错误——原因是目录下存在default_app.asar文件。手动删除该文件后代码可正常执行,且已确认该文件未被任何进程占用。

可行解决方案

方案1:先删除目录内的asar文件再删目录

针对asar文件的特殊性,可先单独删除该文件,再递归删除整个目录:

import { existsSync } from "fs";
import fs from "fs/promises";

export async function makeFolder(path: string) {
  if (existsSync(path)) {
    try {
      // 先删除目录里的default_app.asar文件
      const asarFilePath = `${path}/default_app.asar`;
      if (existsSync(asarFilePath)) {
        await fs.unlink(asarFilePath);
      }
      // 再递归删除目录
      await fs.rm(path, { recursive: true, force: true });
    } catch (e) {
      console.log("ERROR", e);
    }
  }
  await fs.mkdir(path, { recursive: true });
}

方案2:用rimraf替代原生fs.rm

rimraf是专门处理文件删除的工具库,对各类特殊文件、目录的兼容性比原生fs更好,能避免很多边缘问题:

  1. 先安装依赖:
npm install rimraf
  1. 修改代码:
import { existsSync } from "fs";
import fs from "fs/promises";
import rimraf from "rimraf";
import { promisify } from "util";

// 把rimraf转成异步函数
const rimrafAsync = promisify(rimraf);

export async function makeFolder(path: string) {
  if (existsSync(path)) {
    try {
      await rimrafAsync(path);
    } catch (e) {
      console.log("ERROR", e);
    }
  }
  await fs.mkdir(path, { recursive: true });
}

方案3:检查文件权限

如果上面两种方法都无效,可以检查default_app.asar文件的权限设置,确保当前运行代码的进程拥有该文件的删除权限,必要时提升权限执行命令。

内容的提问来源于stack exchange,提问作者Andrei Ranta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 02:47:27