Node.js 如何删除文件?
Node.js 删文件用 fs.unlink(回调)、fs.promises.unlink(Promise)、fs.unlinkSync(同步);删目录用 fs.rm 加 recursive。文件不存在会抛 ENOENT,本文给出各写法与错误处理。
删文件用 fs.unlink 系列;删目录用 fs.rm 加 { recursive: true }。
三种删文件写法
Promise 版(推荐):
import * as fs from 'node:fs/promises'; // 本段保存为.mjs或运行于ESM
try {
await fs.unlink('/path/to/file.txt');
console.log('删除成功');
} catch (err) {
if (err.code === 'ENOENT') console.log('文件本来就不存在');
else throw err;
}
回调版:
const fs = require('fs');
fs.unlink('/path/to/file.txt', (err) => {
if (err) {
console.error('删除失败:', err);
return;
}
console.log('删除成功');
});
同步版(脚本场景):
fs.unlinkSync('/path/to/file.txt');
删除目录
// 空目录
await fs.rmdir('/path/to/emptydir');
// 非空目录(Node 14.14+)
await fs.rm('/path/to/dir', { recursive: true, force: true });
// recursive: 连内容一起删;force: 不存在也不报错
错误处理要点
- ENOENT(文件不存在):最常见的错误,只有“确保不存在”等幂等语义才可忽略;若要求删除现有文件,应报告缺失——用 try/catch 或
fs.rm(p, {force:true}); - EACCES/EPERM:权限不足等原因;unlink目录的错误码依平台可能为EISDIR、EPERM等;
- 文件被占用(Windows 上常见):确保没有句柄还开着它。
常见问题(FAQ)
Q:删除能撤销吗?
不能。unlink 是系统级删除,不进回收站。需要可恢复就自己实现"移到 .trash 目录"的软删除,或用 trash 包。
Q:unlink 和 rm 有什么区别?
对文件两者等价(rm 是后加的通用接口);对目录只有 rm 支持递归。新代码统一用 fs.rm 也行。
Q:删大文件会阻塞吗?
unlink 只是摘掉目录项,耗时取决于文件系统、存储、链接数及元数据处理,不能保证常数时间或不阻塞;同步API仍阻塞事件循环。