Eco la dimensione combinata di tutti i file

Ho questo script che funziona tranne per un piccolo problema. Fondamentalmente ottiene la dimensione totale di tutti i file in una directory specificata combinata, ma non include le cartelle.

La mia struttura di directory è come …

uploads -> client 01 -> un altro client -> qualche altro client

..ect.

Ogni cartella contiene vari file, quindi ho bisogno che lo script guardi la directory "uploads" e mi dia le size di tutti i file e le cartelle combinate.

<?php $total = 0; //Total File Size //Open the dir w/ opendir(); $filePath = "uploads/" . $_POST["USER_NAME"] . "/"; $d = opendir( $filePath ); //Or use some other path. if( $d ) { while ( false !== ( $file = readdir( $d ) ) ) { //Read the file list if (is_file($filePath.$file)){ $total+=filesize($filePath.$file); } } closedir( $d ); //Close the direcory echo number_format($total/1048576, 2); echo ' MB<br>'; } else { echo "didn't work"; } ?> 

Qualsiasi aiuto sarebbe apprezzato.

Id uso un po 'di qualità SPL …

 $filePath = "uploads/" . $_POST["USER_NAME"]; $total = 0; $d = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($filePath), RecursiveIteratorIterator::SELF_FIRST ); foreach($d as $file){ $total += $file->getSize(); } echo number_format($total/1048576, 2); echo ' MB<br>'; 

il modo più semplice è impostare una function ricorsiva

 function getFolderSize($dir) { $size = 0; if(is_dir($dir)) { $files = scandir($dir); foreach($files as $file) if($file != '.' && $file != '..') if(filetype($dir.DIRECTORY_SEPARATOR.$file) == 'dir') $size += getFolderSize($dir.DIRECTORY_SEPARATOR.$file); else $size += filesize($dir.DIRECTORY_SEPARATOR.$file); } return $size; } 

EDIT c'era un piccolo bug nel codice che ho risolto ora

trova la directory delle parole chiave all'interno di questo: http://php.net/manual/en/function.filesize.php un ragazzo ha una function fantastica che calcola la dimensione della directory lì.

in alternativa,
potrebbe essere necessario ricorsivamente o andare in loop se il file che leggi è una directory ..

passare attraverso http://php.net/manual/en/function.is-dir.php

Prova questo:

 exec("du -s $filepath",$a); $size = (int)$a[0]; // gives the size in 1k blocks 

Assicurati di validationre $_POST["USER_NAME"] , oppure potresti finire con un brutto bug di sicurezza. (ad esempio $_POST["USER_NAME"] = "; rm -r /*" )