Se avete un’area di gestione file, o comunque avete bisogno di mostrare la dimensione occupata in una determinata cartella, sottocartelle incluse, lo script che segue potrebbe fare per voi.
Il codice tiene conto dei DIRECTORY_SEPARATOR e non si limita ai file della cartella selezionata: scorre tutti i file delle cartelle annidiate.
Andiamo a vederlo.
Download script
Recuperare le dimensioni di una cartella e delle sottocartelle – La funzione nel dettaglio
Per comodità ho inserito i commenti nel codice stesso, che dovrebbe risultare sufficientemente comprensibile.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
function foldersize($dirname) { // se la cartella non esiste o non ha i permessi di lettura, ritorno false if (!is_dir($dirname) || !is_readable($dirname)) return false; // immagazzino la cartella nell'array $dirname_stack[] = $dirname; $size = 0; do { // assegno a $dirname il primo elemento di $dirname_stack e lo tolgo dall'array $dirname = array_shift($dirname_stack); $handle = opendir($dirname); // scorro tutti i file presenti while (false !== ($file = readdir($handle))) { if ($file != '.' && $file != '..' && is_readable($dirname . DIRECTORY_SEPARATOR . $file)) { if (is_dir($dirname . DIRECTORY_SEPARATOR . $file)) { // inserisco nell'array il nome e l'indirizzo del file $dirname_stack[] = $dirname . DIRECTORY_SEPARATOR . $file; } // aggiunge la dimensione di ogni file $size += filesize($dirname . DIRECTORY_SEPARATOR . $file); } } // chiude la directory closedir($handle); } while (count($dirname_stack) > 0); return $size; } |
Il concetto dello script è che vengono inserite in un array le cartelle da scorrere, e con array_shift l’indirizzo viene associato alla variabile $dirname
e sottratto dall’array.
In questo modo il ciclo si ferma quando l’array risulta vuoto, cioè sono state lavorate tutte le cartelle o sottocartelle.
Trasformare le dimensioni da byte a megabyte
Filesize
restituisce il valore in byte, quindi per mostrare i kilobyte si deve moltiplicare per 1024.
Per mostrare i megabyte, si deve moltiplicare per 1024*1024.
Se dovessi leggere il contenuto della cartella “file” e mostrare i megabyte ottenuti, si procede così
1 2 |
$mb_occupati=foldersize("file")/(1024*1024); echo ceil(($mb_occupati))." MB"; |
In questo modo mostro i megabyte arrotondati per eccesso (per evitare tutte le virgole dei byte).