herramientaSi alguna vez habéis necesitado saber el peso de un archivo a trabes de PHP os habréis encontrado con que es algo relativamente fácil, pero que luego tenemos que hacer la conversión de Bytes a la unidad que queramos si queremos que sea un poco legible... y eso sin contar con las comprobaciones que tenemos que hacer para saber si es un archivo de verdad, si existe ese archivo... vamos algo bastante repetitivo y muy poco estándar. Al intentar hacerlo con una carpeta el lío es aun mayor ya que PHP no tiene ninguna función que determine el tamaño de una carpeta en el servidor (antes de que nadie se me lance al cuello, existe disk_total_space() que según pone en la web, Devuelve el tamaño total de un directorio pero lo que hace es dar la suma de todas las carpetas dentro del directorio del servidor asignado a un usuario). Por este fallo técnico y para ahorrarme reescribir código he compuesto la función size() a partir de las funciones size_readable() y dirsize() encontradas en los comentarios de php.net.

Mi función size() determina automáticamente si la dirección introducida en la primera variable es de un archivo o de un directorio. Como predeterminado da como resultado el tamaño del archivo formateado, dando el numero y la unidad (ejemplo 20 kB), pero esta opción se puede cambiar para q el resultado sea el numero de bites únicamente, poniendo a false la 2º variable de la función. A demás añade una 3º y ultima variable que modificar el numero de corrección de fraccionales.

PHP:
  1. function size($path, $formated = true, $retstring = null){
  2.     if(!is_dir($path) || !is_readable($path)){
  3.         if(is_file($path) || file_exists($path)){
  4.             $size = filesize($path);
  5.         } else {
  6.             return false;
  7.         }
  8.     } else {
  9.         $path_stack[] = $path;
  10.         $size = 0;
  11.        
  12.         do {
  13.             $path   = array_shift($path_stack);
  14.             $handle = opendir($path);
  15.             while(false !== ($file = readdir($handle))) {
  16.                 if($file != '.' && $file != '..' && is_readable($path . DIRECTORY_SEPARATOR . $file)) {
  17.                     if(is_dir($path . DIRECTORY_SEPARATOR . $file)){ $path_stack[] = $path . DIRECTORY_SEPARATOR . $file; }
  18.                     $size += filesize($path . DIRECTORY_SEPARATOR . $file);
  19.                 }
  20.             }
  21.             closedir($handle);
  22.         } while (count($path_stack)> 0);
  23.     }
  24.     if($formated){
  25.         $sizes = array('B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
  26.         if($retstring == null) { $retstring = '%01.2f %s'; }
  27.         $lastsizestring = end($sizes);
  28.         foreach($sizes as $sizestring){
  29.             if($size <1024){ break; }
  30.             if($sizestring != $lastsizestring){ $size /= 1024; }
  31.         }
  32.         if($sizestring == $sizes[0]){ $retstring = '%01d %s'; } // los Bytes normalmente no son fraccionales
  33.         $size = sprintf($retstring, $size, $sizestring);
  34.     }
  35.     return $size;
  36. }

Ejemplo de uso de lectura de tamaños modo humano:

PHP:
  1. $size_index = size("index.php");
  2. $size_dir  = size("./");
  3. echo "El tama&ntilde;o del archivo index.php es " . $size_index . " y el de la carpeta que lo contiene, " . $size_dir;

Ejemplo de uso de lectura de tamaños modo maquina:

PHP:
  1. $size = size("./");
  2. if($size<100){
  3.     echo "El directorio actual tiene menos de 100 B";
  4. } else {
  5.     echo "El directorio actual tiene mas de 100B";
  6. }