使用TypeScript编写一个函数getPackageSize,该函数接收一个配置对象packageOpt作为参数,用于获取指定文件夹中所有文件的总大小,并根据配置决定是否返回已转换单位的大小值或直接通过回调函数返回字节大小

使用TypeScript编写一个函数getPackageSize,该函数接收一个配置对象packageOpt作为参数,用于获取指定文件夹中所有文件的总大小,并根据配置决定是否返回已转换单位的大小值或直接通过回调函数返回字节大小。
下面是一个基于Node.js环境的实现示例,因为直接在浏览器环境中操作文件系统是受限的。

请注意,此示例使用Node.js的fspath模块来遍历目录和读取文件大小,确保您在Node.js环境下运行这段代码。

import fs from 'fs'; import path from 'path'; // 示例接口类型 interface packageOpt { /** 文件夹名(默认:`dist`) */ folder?: string; /** 是否返回已经转化好单位的包总大小(默认:`true`) */ format?: boolean; /** 回调函数,返回包总大小(单位:字节) */ callback: (size: string | number) => void; } /** * 获取指定文件夹中所有文件的总大小 * @param options 配置选项 */ const getPackageSize = (options: packageOpt): void => { const { folder = 'dist', format = true, callback } = options; let totalSize = 0; // 递归函数,用于遍历目录并累加文件大小 const traverseDir = (dirPath: string) => { fs.readdirSync(dirPath).forEach((file) => { const filePath = path.join(dirPath, file); const stats = fs.statSync(filePath); if (stats.isDirectory()) { traverseDir(filePath); // 如果是目录,则递归遍历 } else { totalSize += stats.size; // 如果是文件,则累加大小 } }); }; // 开始遍历指定目录 traverseDir(folder); // 根据format决定是否转换单位,并调用callback const result = format ? formatBytes(totalSize) : totalSize; callback(result); }; // 字节转换为可读单位的辅助函数 const formatBytes = (bytes: number, decimals = 2) => { if (bytes === 0) return '0 Bytes'; const k = 1024; const dm = decimals < 0 ? 0 : decimals; const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; const i = Math.floor(Math.log(bytes) / Math.log(k)); return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + ' ' + sizes[i]; }; // 使用示例 getPackageSize({ folder: './exampleFolder', format: true, callback(size) { console.log(`Total size: ${size}`); }, });

这段代码首先定义了getPackageSize函数,它接收一个实现了packageOpt接口的对象作为参数。函数内部使用fs.readdirSyncfs.statSync同步遍历指定目录下的所有文件和子目录,累加文件大小。
之后,根据format选项决定是否调用formatBytes函数将字节大小转换为可读的单位(如KB、MB等),最后通过回调函数返回计算结果。


__EOF__

本文作者龙陌
本文链接https://www.cnblogs.com/longmo666/p/18187760.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   龙陌  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示