Nodejs之目录操作

fs.unlink

删除文件

fs.mkdir

删除目录

fs.rmdir

创建目录

fs.readdir

读取儿子级别的目录

fs.stat

fs.stat 获取文件的状态信息, isFile() isDirectory()

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

fs.stat(path.resolve(__dirname, 'a'), function (err, statObj) {
    if (statObj.isFile()) {
        fs.unlink(path.resolve(__dirname, 'c'), () => { })
    } else {
        fs.readdir(path.resolve(__dirname, 'a'), function (err,dir) {
        })
    }
})

删除目录

同步

function rmdirSync(directory) {
    const statObj = fs.statSync(path.resolve(__dirname, directory))
    if (statObj.isFile()) { // 文件是直接移除,目录需要读取儿子
        fs.unlinkSync(directory)
    } else {
        let dirs = fs.readdirSync(directory)
        // 递归删除, 如果是文件夹则递归删除,文件直接删除
        dirs = dirs.map(item => rmdirSync(path.join(directory, item)));
        fs.rmdirSync(directory)
    }
}
rmdirSync('a'); // 同步删除

异步

如果是异步的话如何删除, 树, 树的遍历方式有2种 (层序遍历,深度遍历(先序、后,中))

// 串行删除,index++ 有顺序,浪费性能
function rmdir(directory,callback) {
    fs.stat(directory, (err,statObj) => {
        if (statObj.isFile()) {
            fs.unlink(directory,callback)
        } else {
            fs.readdir(directory, (err,dirs) => {
                dirs = dirs.map(item => path.join(directory, item));
                let index = 0;
                function next() {
                    if (dirs.length === index) { // 儿子删除完毕后删除自己
                        return fs.rmdir(directory,callback)
                    }
                    let dir = dirs[index++];
                    // 先删除第一个 ,将下一个删除操作传入进去
                    rmdir(dir, next);
                }
                next();
            })
        }
    })
}
// 并发删除,性能略好
function rmdir(directory, callback) {
    fs.stat(directory, (err, statObj) => {
        if (statObj.isFile()) {
            fs.unlink(directory, callback)
        } else {
            fs.readdir(directory, (err, dirs) => {
                if (dirs.length === 0) return fs.rmdir(directory, callback)
                dirs = dirs.map(item => path.join(directory, item));
                let index = 0;
                function done() {
                    if (++index === dirs.length) {
                        fs.rmdir(directory, callback)
                    }
                }
                dirs.forEach(dir => rmdir(dir, done))
            })
        }
    })
}
// promise处理
function rmdir(directory) {
    return new Promise((resolve, reject) => {
        fs.stat(directory, (err, statObj) => {
            if (statObj.isFile()) {
                fs.unlink(directory, resolve)
            } else {
                fs.readdir(directory, (err, dirs) => {
                    dirs = dirs.map(item => rmdir(path.join(directory, item)));
                    Promise.all(dirs).then(() => {
                        fs.rmdir(directory, resolve)
                    })
                })
            }
        })
    })
}
// async await

const fsPromises = require('fs/promises')
async function rmdir(directory) {
    const statObj = await fsPromises.stat(directory)
    if (statObj.isFile()) {
        return fsPromises.unlink(directory)
    } else {
        let dirs = await fsPromises.readdir(directory)
        dirs = dirs.map(item => rmdir(path.join(directory, item)));
        await Promise.all(dirs)
        return fsPromises.rmdir(directory)
    }
}

层序遍历

// 采用栈的方式

function rmdirSync(directory) {
    let index = 0;
    let stack = [directory];
    let current;
    while (current = stack[index++]) {
        let statObj = fs.statSync(directory);
        if (statObj.isFile()) {
            fs.unlinkSync(current); // 文件直接删除
        } else {
            stack = [...stack,...fs.readdirSync(current).map(item=> path.join(current,item))]
        }
    }
    let i = stack.length;
    while (i--) {
        fs.rmdirSync(stack[i])
    }
}
rmdirSync("a");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值