我想用尽可能少的代码实现
rm -rf
或一个目录及其所有内容。
我只找到了大约 50 行或更多代码的脚本,这一定有少于 10 行的代码片段吗?
有两种方法可以做到这一点,纯 Node.js 或使用 spawn/exec 来使用
rm -rf
命令。
rm -rf
方式:
function spawnCustom(command, options) {
const array = command.split(' ');
const first_command = array[0];
array.shift();
return new Promise((resolve, reject) => {
const spawn = require('child_process').spawn;
const child = spawn(first_command, array, options);
child.stdout.on('data', function(data) {
process.stdout.write('stdout: ' + data);
// Here is where the output goes
});
child.stderr.on('data', function(data) {
process.stdout.write('stderr: ' + data);
// Here is where the error output goes
reject(data);
});
child.on('close', function(code) {
process.stdout.write('closing code: ' + code);
// Here you can get the exit code of the script
resolve();
});
});
}
await spawnCustom('rm -rf ~/example_dir');
Node.js
方式:
const fs = require('fs')
const path = require('path')
let _dirloc = '<path_do_the_directory>'
if (existsSync(_dirloc)) {
fs.readdir(path, (error, files) => {
if(!error) {
for(let file of files) {
// Delete each file
fs.unlinkSync(path.join(_dirloc,file))
}
}
})
// After the done of each file delete,
// Delete the directory itself
if(fs.unlinkSync(_dirloc)) {
console.log('Directory has been deleted!')
}
}
很多简单的代码..一定有更简单的方法吗?
根据 NodeJS v14.0.0 文档,此功能自 v12.10.0 起就可用,但被标记为实验性。
https://nodejs.org/api/fs.html#fs_fs_rmdir_path_options_callback
const fs = require('fs');
(async function() {
const cleanup_result = await new Promise((resolve, reject) => {
fs.rmdir("./temp", {recursive: true}, (err) => resolve(err));
});
console.log(`Cleaned up data with result "${JSON.stringify(cleanup_result)}"`);
)();
const fs = require('fs');
const util = require('util');
const rmdir = util.promisify(fs.rmdir);
(async function() {
const cleanup_result = await rmdir("./temp", {recursive: true});
)();
const fs = require('fs');
// Process blocking action which can halt
// your program if deleting a large directory tree
fs.rmdirSync("./temp", {recursive: true});
这是之前的一个旧答案,
fs
能够在本地做到这一点。查看已接受的答案而不是这个答案。
这就是 rimraf 模块。
可以用2行完成
var rimraf = require('rimraf');
rimraf('/some/directory', () => console.log('done'));
有时候我也想:我真的希望有一个函数可以轻松递归地删除目录。我可以花几个小时谈论这个问题(“是什么让一种语言足够‘完整’”),但我认为这超出了 stackoverflow 的范围。
回答你的问题:首先,你的第一个例子是多余的!我只会使用
exec
因为输出会非常小。你可以重写它更短:
const { exec } = require('child_process');
const deleteDir = (dir) => {
exec(`test -d ${dir} && rm -rf ${dir}`, (err, stdout, stderr) => {
if (err) {
console.error(err);
return;
}
console.log(`stdout: ${stdout}`);
console.log(`stderr: ${stderr}`);
});
deleteDir('example-dir');
在此示例中,
test -d
检查目录是否存在,并在成功时返回退出代码0
或在失败时返回1
(这永远不会触发&&
的右侧部分。
但问题是:如果您正在为更广泛的公众编写代码,您可能会希望支持其他操作系统等。像
rimraf
这样的软件包将为您解决这个问题! 查看其源代码,尤其是测试用例。
当然你可以自己写,但我想因为这么多人使用rimraf,各种奇怪的异常已经被注意到并且已经提交了修复等等。