用递归求最大值PHP,php如何使用递归来计算一个目录中所有文件的大小(代码)...

本篇文章给大家带来的内容是关于php如何使用递归来计算一个目录中所有文件的大小 (代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。sudo find /private/etc -exec ls -l {} \; | awk 'BEGIN {sum=0} {sum+=$5;} END {print sum}' # 4947228

ls -ld /etc #/etc -> private/etc

先计算出/etc目录所有文件的大小4947228

DirUtil.php<?php

/**

* Created by PhpStorm.

* User: Mch

* Date: 8/14/18

* Time: 22:11

*/

class DirUtil {

public static function getSize(string $path) {

$totalSize = 0;

$path = realpath($path);

if (!file_exists($path)) {

return $totalSize;

}

if (!is_dir($path)) {

return filesize($path);

}

if ($dh = opendir($path)) {

while (($file = readdir($dh)) !== false) {

if ($file !== "." && $file !== "..") {

$abs = $path.DIRECTORY_SEPARATOR.$file;

if (is_dir($file)) {

$totalSize += self::getSize($abs);

} else {

$totalSize += filesize($abs);

}

}

}

closedir($dh);

}

return $totalSize;

}

public static function entryForEach(string $path, callable $callback, mixed $data = null) {

$path = realpath($path);

if (!file_exists($path)) {

return 0;

}

if (!is_dir($path)) {

return call_user_func($callback, $path, $data);

}

if ($dh = opendir($path)) {

while (($file = readdir($dh)) !== false) {

if ($file !== "." && $file !== "..") {

$abs = $path.DIRECTORY_SEPARATOR.$file;

if (is_dir($file)) {

self::entryForEach($abs, $callback, $data);

} else {

call_user_func($callback, $abs, $data);

}

}

}

closedir($dh);

}

return 0;

}

public static function entryReduce(string $path, callable $callback, $init) {

$acc = $init;

$path= realpath($path);

if (!file_exists($path)) {

return $acc;

}

if (!is_dir($path)) {

return call_user_func($callback, $acc, $path);

}

if ($dh = opendir($path)) {

while (($file = readdir($dh)) !== false) {

if ($file !== "." && $file !== "..") {

$abs = $path.DIRECTORY_SEPARATOR.$file;

if (is_dir($file)) {

$acc = self::entryReduce($abs, $callback, $acc);

} else {

$acc= call_user_func($callback, $acc, $abs);

}

}

}

closedir($dh);

}

return $acc;

}

}

test:// php ./DirUtil.php /etc

if ($argc < 2) {

printf("Usage: php %s [filename]\n", __FILE__);

exit(1);

}

echo DirUtil::getSize($argv[1]).PHP_EOL; // 899768

$dir_get_size = function($path) {

$size = 0;

DirUtil::entryForEach($path, function($path) use (&$size) {

$size += filesize($path);

});

return $size;

};

echo $dir_get_size($argv[1]).PHP_EOL; // 899768

echo DirUtil::entryReduce($argv[1], function($sum, $path) {

$sum += filesize($path);

return $sum;

}, 0).PHP_EOL; // 899768

相关推荐:

php递归示例 php递归函数代码

PHP递归创建多级目录,php递归

php递归json类实例,php递归json_PHP教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值