nodejs fs模块结合async await处理fs异步使用

该博客介绍了如何使用Node.js进行文件系统操作,包括检查并创建'upload'目录,以及遍历'wwwroot'目录获取子目录。通过fs模块的stat方法判断文件或目录存在性,并使用mkdirp包创建多级目录。同时,展示了使用async/await处理异步操作的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

判断服务器上有没有upload目录 如果没有创建这个目录 有的话不操作

1.方式1

注意 即便没有这个目录但是也要看下有没有同名的无后缀的文件做干扰

在这里插入图片描述

**判断服务器上有没有upload目录 如果没有创建这个目录 有的话不操作**
const fs = require('fs');
var path = './upload';
fs.stat(path, (err, stat) => {
    if (err) {//没有这个文件
        dir(path);
        return;
    }
    if (!stat.isDirectory()) {//没有这个目录
      //判断是否有这个文件(因为没有后缀的文件和文件夹不能重名)  上图所示
        if (stat.isFile()) {//有这个没有后缀的文件
            fs.unlink(path, (err) => {//删除这个没有后缀的文件
                if (!err) {
                    console.log('删除文件成功'); 
                    dir(path)//创建目录
                } 
            })
        } else {//没有这个目录,也没有这个后缀的文件
            dir(path)//创建目录
        }
    } else {
        console.log('有upload目录');

    }
})
//封装函数创建目录
function dir(dir) {
    fs.mkdir(dir, (err) => {
        if (err) {
            return
        }
        console.log('创建upload目录');

    })
}

2.使用npm包快速实现功能
https://www.npmjs.com/package/mkdirp

1. npm  i mkdirp  --save  / cnpm i mkdirp --save
2. const mkdirp=require('mkdirp') 
3.使用
mkdirp('./upload').then(made =>
  console.log(`made directories, starting with ${made}`)
  )

判断wwwrouter下的文件是不是一个目录 是的话追加到数组中

1.方法1:

const fs = require('fs');
let path = './wwwroot';
let arr = [];
fs.readdir(path, (err, data) => {
    if (err) { throw err }
    for (let i = 0; i < data.length; i++) { 
        fs.stat(`${path}/${data[i]}`, (err, state) => {
            if (err) { throw err }
            if (state.isDirectory()) {
                arr.push(data[i]) 
            }
            if (i == data.length - 1) {
                console.log(arr)
            }
        })
    }
})

方法2,function函数自调用递归

const fs = require('fs');
let path = './wwwroot';
let arr = [];
fs.readdir(path, (err, data) => {
    if (err) { throw err }
    (function main(i) {
        if (i == data.length) {
            console.log(arr)
            return;
        }
        fs.stat(`${path}/${data[i]}`, (err, state) => {
            if (state.isDirectory()) {
                arr.push(data[i])
            }
            main(++i)
        })
    })(0)
})

方法3.es6 new Promise es7 async await

async让方法变为异步返回promise await 等待异步方法执行完
await必须写在async内两者配合使用


const fs = require('fs');
// 封装一个专门使用判断是否为目录的函数
 async function dir(path) {
    return new Promise((resolve, reject) => {
        fs.stat(path, (err, data) => {
            if (err) { throw err }
            if (data.isDirectory()) {
                resolve(true)
            } else {
                resolve(false)
            }

        })
    })
}

// 专门封装一个循环获取目录的函数
function main() {
    let path = './wwwroot'
    let arr = [];
    fs.readdir(path, async (err, data) => {
        for (var i = 0; i < data.length; i++) {
            await dir(`${path}/${data[i]}`).then(res => {
                if (res) {
                    arr.push(data[i])
                }
            })
        }
        console.log(arr)

    })
}
main()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值