Il peut être intéressant pour certains traitements de connaître la taille totale d'un dossier. PHP ne fournit pas de fonction donnant cette information et nous devons donc en écrire une.

Nous utiliserons ici aussi la récursivité pour caculer la taille de chacun des sous-dossiers éventuels d'une arborescence.
Quand nous sommes en présence d'un fichier, la fonction filesize() nous renvoie sa taille, qui est cumulée dans une variable renvoyée en fin de traitement par la fonction.

Exemple : taille d'un dossier
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Taille d\'un dossier'); $nomDossier = 'test_repert'; htmlInfo("Taille du dossier $nomDossier en octets"); echo tailleDossier($nomDossier); htmlFin(); //===================================================== /** * Calcul en octets la taille d'un dossier * @param string $nomDossier Nom du dossier * @return integer Taille du dossier en octets */ function tailleDossier($nomDossier) { $taille = 0; $dossier = @opendir($nomDossier); if (! $dossier) { return $taille; } while (($elem = readdir($dossier)) !== FALSE) { if ($elem == '.' || $elem == '..') { continue; } $complet = "$nomDossier/$elem"; if (@is_dir($complet)) { $taille += tailleDossier($complet); } else { $taille += @filesize($complet); } } return $taille; } ?>

Le résultat brut que nous obtenons peut être formaté pour afficher des tailles en ko, Mo, etc. La fonction sprintf() nous y aide :

    /**
     * Formate un nombre en octets
     * @param integer	$taille		Nombre d'octets
     * @return string	Taille en octets, ko, Mo, etc.
     */
    function formateTaille($taille) {
    	if ($taille == 0) {
    		return '0 o';
    	}
    	if($taille <= 1024) {
    		return $taille.' o';
    	}
    	if($taille <= (10*1024)) {
    		return sprintf("%.2f k%s",($taille/1024),'o');
    	}
    	if($taille <= (100*1024)) {
    		return sprintf("%.1f k%s",($taille/1024),'o');
    	}
    	if($taille <= (1024*1024)) {
    		return sprintf("%d k%s",($taille/1024),'o');
    	}
    	if($taille <= (10*1024*1024)) {
    		return sprintf("%.2f M%s",($taille/(1024*1024)),'o');
    	}
    	if($taille <= (100*1024*1024)) {
    		return sprintf("%.1f M%s",($taille/(1024*1024)),'o');
    	}
    	return sprintf("%d M%s",($taille/(1024*1024)),'o');
    }

Exemple : taille d'un dossier
<?php ob_start(); require('bib_fonctions.php'); htmlDebut('Taille d\'un dossier'); $nomDossier = 'test_repert'; htmlInfo("Taille du dossier $nomDossier en octets"); echo formateTaille(tailleDossier($nomDossier)); htmlFin(); //===================================================== /** * Calcul en octets la taille d'un dossier * @param string $nomDossier Nom du dossier * @return integer Taille du dossier en octets */ function tailleDossier($nomDossier) { $taille = 0; $dossier = @opendir($nomDossier); if (! $dossier) { return $taille; } while (($elem = readdir($dossier)) !== FALSE) { if ($elem == '.' || $elem == '..') { continue; } $complet = "$nomDossier/$elem"; if (@is_dir($complet)) { $taille += tailleDossier($complet); } else { $taille += @filesize($complet); } } return $taille; } //===================================================== /** * Formate un nombre en octets * @param integer $taille Nombre d'octets * @return string Taille en octets, ko, Mo, etc. */ function formateTaille($taille) { if ($taille == 0) { return '0 o'; } if($taille <= 1024) { return $taille.' o'; } if($taille <= (10*1024)) { return sprintf("%.2f k%s",($taille/1024),'o'); } if($taille <= (100*1024)) { return sprintf("%.1f k%s",($taille/1024),'o'); } if($taille <= (1024*1024)) { return sprintf("%d k%s",($taille/1024),'o'); } if($taille <= (10*1024*1024)) { return sprintf("%.2f M%s",($taille/(1024*1024)),'o'); } if($taille <= (100*1024*1024)) { return sprintf("%.1f M%s",($taille/(1024*1024)),'o'); } return sprintf("%d M%s",($taille/(1024*1024)),'o'); } ?>