我想用尽可能少的代码来实现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!')
}
}
很多简单的代码。必须有更简单的方法吗?
答案 0 :(得分:4)
那将是rimraf模块。
可以两行完成
var rimraf = require('rimraf');
rimraf('/some/directory', () => console.log('done'));
答案 1 :(得分:0)
有些时候我也想:我真的希望有一个功能可以轻松地递归删除目录。我可以谈论几个小时(“什么使一种语言“足够”'足够”了),但是我认为这超出了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
(这将永远不会触发{{ 1}}。
但是事实是:如果您要为更大的公众编写代码,则您希望支持其他操作系统。像&&
这样的软件包将为您解决这些问题! Look at its source code,尤其是测试用例。
您当然可以自己编写它,但是我认为由于有太多人使用rimraf,因此注意到了各种奇怪的异常,并且已经提交了修复程序。
答案 2 :(得分:0)
根据NodeJS v14.0.0文档,此功能自v12.10.0开始提供,但标记为实验性的。
https://nodejs.org/api/fs.html#fs_fs_rmdir_path_options_callback
const fs = require('fs');
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');
// Process blocking action which can halt
// your program if deleting a large directory tree
fs.rmdirSync("./temp", {recursive: true});