Nodejs有api能递归删除dir么

Nodejs有api能递归删除dir么

rmdir只能在文件夹非空的时候用……好不爽……

9 回复

当然可以!在 Node.js 中,fs 模块提供了一些 API 来处理文件系统操作。虽然 fs.rmdir() 只能用于删除空目录,但你可以通过递归的方式来实现删除包含文件的目录。

为了方便起见,我们可以创建一个自定义函数来递归删除目录及其所有内容。以下是一个示例代码:

const fs = require('fs');
const path = require('path');

// 递归删除目录及其所有内容
function rimraf(dirPath) {
    if (!fs.existsSync(dirPath)) {
        return;
    }

    // 读取目录中的所有文件及子目录
    fs.readdirSync(dirPath).forEach(entry => {
        const entryPath = path.join(dirPath, entry);
        
        // 如果是文件,则直接删除
        if (fs.lstatSync(entryPath).isFile()) {
            fs.unlinkSync(entryPath);
        } else {
            // 如果是目录,则递归删除
            rimraf(entryPath);
        }
    });

    // 删除空目录
    fs.rmdirSync(dirPath);
}

// 使用示例
const dirToDelete = './testDir';
rimraf(dirToDelete);

解释

  1. 引入模块:我们首先引入了 fspath 模块。fs 用于文件系统操作,而 path 用于处理路径。
  2. 定义函数rimraf 函数接受一个目录路径作为参数。
  3. 检查目录是否存在:如果指定的目录不存在,则直接返回。
  4. 读取目录内容:使用 fs.readdirSync() 方法读取目录中的所有文件和子目录,并将它们存储在一个数组中。
  5. 遍历内容
    • 对于每个文件,使用 fs.unlinkSync() 方法删除它。
    • 对于每个子目录,递归调用 rimraf() 函数。
  6. 删除空目录:最后,使用 fs.rmdirSync() 方法删除空目录。

这样,你就可以递归地删除一个包含文件和子目录的目录了。


var exec = require('child_process').exec;
exec('rm -rf '+dirpath, function(err){
//....
});

好主意……

支持:rimraf

fs-extra: remove(dir)

除了二楼提供的方案。 其它的方案,在删除时都会抛出目录非空,无法删除的异常,我已经为此问题头疼很久了,详情可见http://cnodejs.org:8080/topic/5449b13cf62eb407553255fb

Node.js 提供了一些内置的方法来帮助我们递归删除目录。你可以使用 fs 模块中的方法结合递归函数来实现这一点。

示例代码

const fs = require('fs');
const path = require('path');

function rimraf(dirPath) {
    if (!fs.existsSync(dirPath)) {
        return;
    }

    fs.readdirSync(dirPath).forEach(entry => {
        const entryPath = path.join(dirPath, entry);

        // 检查是否为目录
        if (fs.lstatSync(entryPath).isDirectory()) {
            rimraf(entryPath); // 递归删除子目录
        } else {
            fs.unlinkSync(entryPath); // 删除文件
        }
    });

    fs.rmdirSync(dirPath); // 删除空目录
}

// 使用示例
rimraf('/path/to/directory');

解释

  1. fs.readdirSync:同步读取目录中的所有条目(文件或子目录)。
  2. fs.lstatSync:同步获取文件状态,用于判断当前条目是文件还是目录。
  3. fs.unlinkSync:同步删除文件。
  4. fs.rmdirSync:同步删除空目录。
  5. 递归:通过调用自身来处理每个子目录,从而递归地删除整个目录结构。

这种方法能够递归地删除指定目录及其所有内容,包括文件和子目录。

注意事项

  • 确保你有足够的权限来删除目标目录。
  • 在生产环境中建议使用异步版本以避免阻塞事件循环(例如 fs.promises 或第三方库如 globdel)。

异步版本(可选)

如果你希望使用异步方式来实现递归删除目录,可以考虑使用 fs.promises

const fsPromises = require('fs').promises;
const path = require('path');

async function rimraf(dirPath) {
    if (!(await fsPromises.exists(dirPath))) {
        return;
    }

    const entries = await fsPromises.readdir(dirPath);

    for (const entry of entries) {
        const entryPath = path.join(dirPath, entry);
        const stats = await fsPromises.lstat(entryPath);

        if (stats.isDirectory()) {
            await rimraf(entryPath); // 递归删除子目录
        } else {
            await fsPromises.unlink(entryPath); // 删除文件
        }
    }

    await fsPromises.rmdir(dirPath); // 删除空目录
}

// 使用示例
rimraf('/path/to/directory').catch(console.error);

这样,你可以避免阻塞事件循环,并且代码更加现代。

回到顶部