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

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

判断服务器上有没有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()
相关文章
|
3月前
|
JavaScript
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
Node.js【GET/POST请求、http模块、路由、创建客户端、作为中间层、文件系统模块】(二)-全面详解(学习总结---从入门到深化)
28 0
|
2天前
|
消息中间件 监控 JavaScript
Node.js中的进程管理:child_process模块与进程管理
【4月更文挑战第30天】Node.js的`child_process`模块用于创建子进程,支持执行系统命令、运行脚本和进程间通信。主要方法包括:`exec`(执行命令,适合简单任务)、`execFile`(安全执行文件)、`spawn`(实时通信,处理大量数据)和`fork`(创建Node.js子进程,支持IPC)。有效的进程管理策略涉及限制并发进程、处理错误和退出事件、使用流通信、谨慎使用IPC以及监控和日志记录,以确保应用的稳定性和性能。
|
3天前
|
缓存 JavaScript 前端开发
Node.js的模块系统:CommonJS模块系统的使用
【4月更文挑战第29天】Node.js采用CommonJS作为模块系统,每个文件视为独立模块,通过`module.exports`导出和`require`引入实现依赖。模块有独立作用域,保证封装性,防止命名冲突。引入的模块会被缓存,提高加载效率并确保一致性。利用CommonJS,开发者能编写更模块化、可维护的代码。
|
3天前
|
JavaScript 大数据 开发者
Node.js的异步I/O模型与事件循环:深度解析
【4月更文挑战第29天】本文深入解析Node.js的异步I/O模型和事件循环机制。Node.js采用单线程与异步I/O,遇到I/O操作时立即返回并继续执行,结果存入回调函数队列。事件循环不断检查并处理I/O事件,通过回调函数通知结果,实现非阻塞和高并发。这种事件驱动编程模型简化了编程,使开发者更专注业务逻辑,为高并发场景提供高效解决方案。
|
17天前
|
JavaScript API
node.js之模块系统
node.js之模块系统
|
20天前
|
Web App开发 JavaScript 前端开发
【Node系列】node核心模块util
Node.js的核心模块util为开发者提供了一些常用的实用工具函数。这些函数能够很方便地进行对象的继承、类型判断以及其他工具函数的实现。
22 2
|
20天前
|
域名解析 网络协议 JavaScript
【Node系列】node工具模块
Node.js有多个内置的工具模块,这些模块提供了用于执行各种任务的功能。
22 2
|
20天前
|
缓存 并行计算 JavaScript
【Node系列】模块系统
Node.js 的模块系统是其核心特性之一,允许开发者编写可复用的代码,并通过简单的导入和导出机制来共享和使用这些模块。
19 3
|
2月前
|
JavaScript 前端开发
Node.js之path路径模块
Node.js之path路径模块
|
2月前
|
JavaScript
Node.js之http模块
Node.js之http模块