Maison > développement back-end > tutoriel php > Comment utiliser la récursivité en php pour calculer la taille de tous les fichiers d'un répertoire (code)

Comment utiliser la récursivité en php pour calculer la taille de tous les fichiers d'un répertoire (code)

不言
Libérer: 2023-04-03 19:28:02
original
1292 Les gens l'ont consulté

本篇文章给大家带来的内容是关于php如何使用递归来计算一个目录中所有文件的大小 (代码),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

sudo find /private/etc -exec ls -l {} \; | awk 'BEGIN {sum=0} {sum+=$5;} END {print sum}'  # 4947228
ls -ld /etc  #/etc -> private/etc
Copier après la connexion

先计算出/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;
    }
}
Copier après la connexion

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
Copier après la connexion

 相关推荐:

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

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

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
php
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal