在我的节点应用程序中,我需要删除一个目录,其中有一些文件,但fs。Rmdir只适用于空目录。我该怎么做呢?
当前回答
只需使用rmdir模块!这很简单。
其他回答
在Node.js的最新版本(12.10.0或更高版本)中,rmdir样式函数fs.rmdir()、fs.rmdirSync()和fs.promises.rmdir()有一个新的实验性选项递归,允许删除非空目录,例如:
fs.rmdir(path, { recursive: true });
GitHub上的相关PR: https://github.com/nodejs/node/pull/29168
下面是@SharpCoder的答案的异步版本
const fs = require('fs');
const path = require('path');
function deleteFile(dir, file) {
return new Promise(function (resolve, reject) {
var filePath = path.join(dir, file);
fs.lstat(filePath, function (err, stats) {
if (err) {
return reject(err);
}
if (stats.isDirectory()) {
resolve(deleteDirectory(filePath));
} else {
fs.unlink(filePath, function (err) {
if (err) {
return reject(err);
}
resolve();
});
}
});
});
};
function deleteDirectory(dir) {
return new Promise(function (resolve, reject) {
fs.access(dir, function (err) {
if (err) {
return reject(err);
}
fs.readdir(dir, function (err, files) {
if (err) {
return reject(err);
}
Promise.all(files.map(function (file) {
return deleteFile(dir, file);
})).then(function () {
fs.rmdir(dir, function (err) {
if (err) {
return reject(err);
}
resolve();
});
}).catch(reject);
});
});
});
};
从Node.js 14.14.0开始,推荐使用fs.rmSync:
fs.rmSync(dir, { recursive: true, force: true });
从Node文档中可以看到。
要获得类似rm -rf Unix命令的行为,请使用带有选项{recursive: true, force: true}的fs.rm()。
例如(ESM)
import { rm } from 'node:fs/promises';
await rm('/path/to', { recursive: true, force: true });
我希望有一种方法可以做到这一点,而不需要为如此微小和常见的东西添加额外的模块,但这是我能想到的最好的方法。
更新: 现在应该在Windows上工作(测试Windows 10),也应该在Linux/Unix/BSD/Mac系统上工作。
const
execSync = require("child_process").execSync,
fs = require("fs"),
os = require("os");
let removeDirCmd, theDir;
removeDirCmd = os.platform() === 'win32' ? "rmdir /s /q " : "rm -rf ";
theDir = __dirname + "/../web-ui/css/";
// WARNING: Do not specify a single file as the windows rmdir command will error.
if (fs.existsSync(theDir)) {
console.log(' removing the ' + theDir + ' directory.');
execSync(removeDirCmd + '"' + theDir + '"', function (err) {
console.log(err);
});
}
推荐文章
- 为什么在节点REPL中没有定义__dirname ?
- 在Node.js中克隆对象
- Node.js中的process.env.PORT是什么?
- js的Mongoose.js字符串到ObjectId函数
- ELIFECYCLE Node.js错误是什么意思?
- 如何完全卸载Ubuntu中的nodejs, npm和node
- 在猫鼬模式中添加created_at和updated_at字段
- 我如何把变量javascript字符串?
- 如何强制tsc忽略node_modules文件夹?
- NPM全局安装“无法找到模块”
- MongoDB和Mongoose的区别
- 如何使用Express.js指定HTTP错误码?
- 通过npm安装Twitter Bootstrap的目的?
- 将文件中的字符串替换为nodejs
- 事件循环上下文中微任务和宏任务的区别