PHP递归计算文件夹大小及单位格式化函数

顾言
顾言
发布时间:2026-10-14 | 5人浏览过
原创

在PHP开发中,有时需要获取服务器端某个文件夹的总大小以便进行存储管理或监控。本文将提供一个实用的PHP代码示例,包含一个递归计算文件夹大小的核心函数以及一个自动识别单位(B/KB/MB/GB/TB)的格式化函数。

核心功能说明

该方案主要解决两个问题:一是如何准确累加文件夹内所有文件及子文件夹的大小;二是如何将巨大的字节数值转换为易读的字符格式。实现逻辑依赖于PHP内置的文件系统函数,如 opendir、readdir、is_dir 和 filesize。

完整代码实现

以下代码分为两个部分:主函数 getDirSize 负责递归遍历,辅助函数 getRealSize 负责单位换算。

<?php
// 1. 获取文件夹大小函数
function getDirSize($dir) {
    $handle = opendir($dir);
    $sizeResult = 0; // 初始化大小变量,防止未定义警告
    
    while (false !== ($FolderOrFile = readdir($handle))) {
        // 跳过当前目录(.)和父目录(..)
        if($FolderOrFile != "." && $FolderOrFile != "..") {
            $fullPath = $dir . "/" . $FolderOrFile;
            
            if(is_dir($fullPath)) {
                // 如果是目录,递归调用自身获取子目录大小
                $sizeResult += getDirSize($fullPath); 
            } else {
                // 如果是文件,累加其大小
                $sizeResult += filesize($fullPath); 
            }
        } 
    }
    closedir($handle);
    return $sizeResult;
}

// 2. 单位自动转换函数
function getRealSize($size) {
    $kb = 1024;   // Kilobyte
    $mb = 1024 * $kb; // Megabyte
    $gb = 1024 * $mb; // Gigabyte
    $tb = 1024 * $gb; // Terabyte
    
    if($size < $kb) {
        return $size." B";
    } else if($size < $mb) {
        return round($size/$kb, 2)." KB";
    } else if($size < $gb) {
        return round($size/$mb, 2)." MB";
    } else if($size < $tb) {
        return round($size/$gb, 2)." GB";
    } else {
        return round($size/$tb, 2)." TB";
    }
}

// 3. 使用示例
$targetDir = './test_folder'; // 替换为实际路径
// 确保路径存在且可读
if(is_dir($targetDir)) {
    echo "文件夹大小: " . getRealSize(getDirSize($targetDir));
} else {
    echo "目录不存在或权限不足";
}
?>

关键步骤解析

第1步:初始化与资源打开

调用 opendir($dir) 打开目录句柄。需要注意在函数内部初始化 $sizeResult = 0,因为每次递归调用都应从0开始累加当前层级的大小,否则会导致数据重复计算。

第2步:遍历与过滤

使用 while 循环配合 readdir() 读取目录内容。必须严格过滤 . 和 ..,否则会进入无限递归或逻辑错误。同时建议拼接完整路径 $dir . "/" . $FolderOrFile 再进行检查,以确保路径正确性。

第3步:类型判断与递归

使用 is_dir() 判断当前条目是文件还是目录。如果是目录,则再次调用 getDirSize() 并累加返回值;如果是文件,直接通过 filesize() 获取大小并累加。最后务必调用 closedir() 释放资源。

第4步:单位格式化

获取到的原始大小为字节数(Integer)。getRealSize() 函数通过比较阈值,逐级除以1024并使用 round() 保留两位小数,最后附加相应的单位后缀,使结果更直观。

注意事项

  • 性能问题:对于包含大量文件或深层嵌套的大型目录,递归方法可能会消耗较多内存和时间,且在超大目录中可能导致超时。生产环境中建议结合缓存或使用命令行工具(如Linux下的 du -sh)作为替代方案。
  • 权限限制:如果PHP进程没有读取某些子目录的权限,opendir 或 filesize 可能会产生警告或返回假值,导致结果偏小。建议先检查文件权限。
  • 符号链接:上述代码未处理符号链接(Symlinks)。如果目录中包含指向外部目录的软链接,递归可能会导致死循环或统计错误,需根据实际情况增加 is_link() 的判断逻辑。

以上就是PHP获取文件夹大小函数用法实例的详细内容,更多关于PHP文件夹操作与文件大小处理的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表