用Node.js编写的rm -rf

时间:2018-10-17 08:38:33

标签: node.js

我想用尽可能少的代码来实现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!')
    }
}

很多简单的代码。必须有更简单的方法吗?

3 个答案:

答案 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)

自Node v12.10起可用(实验性)

根据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});