使用TypeScript编写一个函数getPackageSize,该函数接收一个配置对象packageOpt作为参数,用于获取指定文件夹中所有文件的总大小,并根据配置决定是否返回已转换单位的大小值或直接通过回调函数返回字节大小
使用TypeScript编写一个函数getPackageSize
,该函数接收一个配置对象packageOpt
作为参数,用于获取指定文件夹中所有文件的总大小,并根据配置决定是否返回已转换单位的大小值或直接通过回调函数返回字节大小。
下面是一个基于Node.js环境的实现示例,因为直接在浏览器环境中操作文件系统是受限的。
请注意,此示例使用Node.js的fs
和path
模块来遍历目录和读取文件大小,确保您在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.readdirSync
和fs.statSync
同步遍历指定目录下的所有文件和子目录,累加文件大小。
之后,根据format
选项决定是否调用formatBytes
函数将字节大小转换为可读的单位(如KB、MB等),最后通过回调函数返回计算结果。