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更好,能避免很多边缘问题:
- 先安装依赖:
npm install rimraf
- 修改代码:
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
相关产品推荐
相关产品推荐

