Node.js 如何删除文件?
Node.js 删文件用 fs.unlink(回调)、fs.promises.unlink(Promise)、fs.unlinkSync(同步);删目录用 fs.rm 加 recursive。文件不存在会抛 ENOENT,本文给出各写法与错误处理。
删文件用 fs.unlink 系列;删目录用 fs.rm 加 { recursive: true }。
三种删文件写法
Promise 版(推荐):
const fs = require('fs').promises;
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 删目录;
- 文件被占用(Windows 上常见):确保没有句柄还开着它。
常见问题(FAQ)
Q:删除能撤销吗?
不能。unlink 是系统级删除,不进回收站。需要可恢复就自己实现"移到 .trash 目录"的软删除,或用 trash 包。
Q:unlink 和 rm 有什么区别?
对文件两者等价(rm 是后加的通用接口);对目录只有 rm 支持递归。新代码统一用 fs.rm 也行。
Q:删大文件会阻塞吗?
unlink 只是摘掉目录项,速度极快,与文件大小无关。