使用Nodejs计算文件夹中所有文件的大小

fs和path

NodeJS中的fs模块专门用于处理文件,path模块用于处理路径

利用这两个模块就可以自己实现对文件夹中所有文件大小的计算

同步计算方法

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

// 同步计算,利用回调函数和递归来完成多层级目录中的文件大小计算
function calcSizeSync(dirPath,cb){
    let fileSize=0
    let error=null
    function calc(dirPath,cb1){
        const statObj=fs.statSync(dirPath)
        if(statObj.isDirectory()){
            try {
                const files=fs.readdirSync(dirPath)
                let dirs=files.map(item=>{
                    return path.join(dirPath,item)
                })
                let index = 0
                function next () {
                  if (index < dirs.length) return cb1&&cb1()
                  let current = dirs[index++]
                  calc(current, next)
                }
                next()
            } catch (err) {
                error=err
            }
            
        }else{
            fileSize+=statObj.size
            cb1&&cb1()
        }
    }
    calc(dirPath)
    cb(error,fileSize)
}

异步计算方法,使用async/await

const fs=require('fs')
const path=require('path');
// 使用promisify方法来promise化指定方法
const { promisify } = require('util');
stat=promisify(fs.stat)
readdir=promisify(fs.readdir)

// 异步
async function calcSize(dirPath,cb){
    let fileSize=0;
    let error=null
    async function calc(dirPath){
        try {
            const statObj=await stat(dirPath)
            if(statObj.isDirectory()){
                const files=await readdir(dirPath)
                let dirs=files.map(item=>{
                    return path.join(dirPath,item)
                })
                let index = 0
                async function next () {
                    if (index < dirs.length){
                        let current = dirs[index++]
                        await calc(current)
                        await next()
                    }
                }
                return await next()
            }else{
                fileSize+=statObj.size
            }
        } catch (err) {
            error=err
        }
    }
    await calc(dirPath)
    cb(error,fileSize)
}

测试

calcSize('test',(err,size)=>{
    if(err) console.log(err)
    else console.log("异步执行文件大小:"+size)
})
calcSizeSync('test',(err,size)=>{
    if(err) console.log(err)
    else console.log("同步执行文件大小:"+size)
})
posted @ 2021-07-25 01:56  MissSage  阅读(1612)  评论(0编辑  收藏  举报