zoukankan      html  css  js  c++  java
  • 使用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)
    })
    
  • 相关阅读:
    C++Primer第7章 类
    网络编程I/O复用
    bg和fg
    I/O复用的高级应用一:非阻塞connect
    C++Primer第6章 函数
    mvn archetype:createfromproject报错The specified user settings file does not exist
    C++Primer第13章 拷贝控制
    g++编译多线程
    .NET开发者必备的19个开发工具
    jQuery UI Datepicker繁體中文年月選單換行的小修正
  • 原文地址:https://www.cnblogs.com/MissSage/p/15056944.html
Copyright © 2011-2022 走看看