rm -rf 用 Node.js 编写

问题描述 投票:0回答:4

我想用尽可能少的代码实现

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!')
    }
}

很多简单的代码..一定有更简单的方法吗?

node.js
4个回答
5
投票

自 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');

(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});

5
投票

这是之前的一个旧答案,

fs
能够在本地做到这一点。查看已接受的答案而不是这个答案。


这就是 rimraf 模块。

可以用2行完成

 var rimraf = require('rimraf');
 rimraf('/some/directory', () => console.log('done'));

1
投票

执行此操作的现代方法是使用

fs.rm({ recursive: true })
。请参阅文档


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
(这永远不会触发
&&
的右侧部分。

但问题是:如果您正在为更广泛的公众编写代码,您可能会希望支持其他操作系统等。像

rimraf
这样的软件包将为您解决这个问题! 查看其源代码,尤其是测试用例。

当然你可以自己写,但我想因为这么多人使用rimraf,各种奇怪的异常已经被注意到并且已经提交了修复等等。

© www.soinside.com 2019 - 2024. All rights reserved.