SoloCodigo
		Programación Web y Scripting => PHP => Mensaje iniciado por: objetivophp en Lunes  6 de Diciembre de 2010, 03:48
		
			
			- 
				<?php
 /**
 * Clase Directorio.
 * Se encarga de recorrer directorios y proporcionar informacion de los archivos y
 * directorios que contiene.
 *
 * @package     archivos creado en el projecto opet
 * @copyright   2010 - ObjetivoPHP
 * @license     Gratuito (Free) http://www.opensource.org/licenses/gpl-license.html
 * @author      Marcelo Castro (ObjetivoPHP)
 * @li<x>nk        objetivophp@******.***.**
 * @version     0.4.0 (24/03/2009 - 28/11/2010)
 */
 class Directorio
 {
 /**
 * Especifica que tipo de listado se retornara.
 * En este caso solo se listan los directorios.
 */
 const OP_LIST_DIRECTORIOS = 1;
 
 /**
 * Especifica que tipo de listado se retornara.
 * En este caso solo se listan los archivos.
 */
 const OP_LIST_ARCHIVOS    = 2;
 
 /**
 * Especifica que tipo de listado se retornara.
 * En este caso lista directorios y archivos.
 */
 const OP_LIST_AMBOS       = 3;
 
 /**
 * Solo se accedera de este directorio hacia abajo a sus hijos no se listan
 * los padres del directorio. Es el directorio ba<x>se.
 * @var string
 */
 private $_dirba<x>se = './';
 
 /**
 * Marca cuantos directorios hacia abajo listara. Con cero solo listara el
 * directorio ba<x>se.
 * @var integer
 */
 private $_profundidadEscaneo = 0;
 
 /**
 * Configuramos que tipo de resultados queremos. Solo archivos solo
 * directorios o retorna ambos.
 * @var integer
 */
 private $_listarDir = 3;
 
 /**
 * Contiene los tipos de archivos que se listaran.
 * @var array
 */
 private $_tipoArchivos = array();
 
 /**
 * Guarda los resultados de la busqueda.
 * @var array
 */
 private $_resultados = array();
 
 /**
 * Metodo __construct.
 * @param   string $dirExploracion  Directorio ba<x>se de la exploracion.
 *                                  No se puede utilizar ../ en caso de necesitar
 *                                  y hacia atras utilizar direcciones absolutas.
 * @return  void
 */
 public function  __construct($dirExploracion)
 {
 if (strpos('../' $dirExploracion)) {
 trigger_error('Directorio de Exploracion no valido.' E_USER_ERROR);
 }
 $this->_dirba<x>se = $dirExploracion;
 date_default_timezone_set('America/Montevideo');
 }
 
 /**
 * Metodo setProfundidadEscaneo.
 * @param   integer $profundidad    Cantidad de directorios que se analizaran
 *                                  en cascada.
 * @return  void
 */
 public function setProfundidadEscaneo($profundidad = 0)
 {
 $this->_profundidadEscaneo = (int) $profundidad;
 }
 
 /**
 * Metodo setListarDirectorios.
 * @param   integer     $dir 1 directorios 2 archivos 3 ambos.
 * @return  void
 */
 public function setListarDirectorios($listado = 3)
 {
 switch ($listado) {
 case Directorio::OP_LIST_DIRECTORIOS:
 $this->_listarDir   = Directorio::OP_LIST_DIRECTORIOS;
 break;
 case Directorio::OP_LIST_ARCHIVOS:
 $this->_listarDir   = Directorio::OP_LIST_ARCHIVOS;
 break;
 case Directorio::OP_LIST_AMBOS:
 $this->_listarDir   = Directorio::OP_LIST_AMBOS;
 break;
 default :
 $this->_listarDir   = Directorio::OP_LIST_AMBOS;
 }
 }
 
 /**
 * Metodo addTiposArchivosListar.
 * @param   string  $extencion  Extencion de los archivos a listar.
 * @return  void
 */
 public function addTiposArchivosListar($extencion)
 {
 $this->_tipoArchivos[] = addslashes($extencion);
 }
 
 /**
 * Metodo listar.
 * Enruta las peticiones de listado al metodo correspondiente y retorna
 * los datos obtenidos.
 * @return array
 */
 public function listar()
 {
 switch ($this->_listarDir) {
 case Directorio::OP_LIST_DIRECTORIOS:
 $this->_listarDirectorios();
 break;
 case Directorio::OP_LIST_ARCHIVOS:
 $this->_listarArchivos();
 break;
 case Directorio::OP_LIST_AMBOS:
 $this->_listarTodo();
 break;
 default :
 $this->_listarTodo();
 }
 return $this->_resultados;
 }
 
 
 /**
 * Metodo ordenar.
 * Ordena los resultados de acuerdo a la clave elegida.
 * @param   string  $clave  Clave por la cual se quiere ordenar.
 * @param   boolean $asc    true para ascendente false para descendente.
 * @return  array
 */
 public function ordenar($clave = 'name' $asc = true)
 {
 if (empty($this->_resultados)) {
 return false;
 //trigger_error('Primero debe usar la funcion listar o getNombresArchivos' E_USER_ERROR);
 }
 
 $tiposOrden = array('date' 'dateUpdate' 'size' 'hash' 'name' 'nameSort' 'extencion' );
 $ordenarPor = (in_array($clave $tiposOrden))? $clave : 'name';
 $ascDesc    = ($asc)? SORT_ASC : SORT_DESC;
 $caracter   = 0;
 
 foreach ($this->_resultados as $ordenado) {
 $tmpArray[] = $ordenado[$ordenarPor];
 $caracter   = is_string($ordenado[$ordenarPor])? $caracter+1 : $caracter;
 }
 
 $numero     = ($caracter)? SORT_STRING : SORT_NUMERIC;
 
 array_multisort($tmpArray $ascDesc $numero $this->_resultados);
 return $this->_resultados;
 }
 
 /**
 * Metodo _listarArchivos.
 * Genera el arreglo de resultados correspondiente solo a archivos.
 * @return void
 */
 public function _listarArchivos()
 {
 $objIterator = new RecursiveIteratorIterator($obj_Directory = new RecursiveDirectoryIterator($this->_dirba<x>se)
 RecursiveIteratorIterator::SELF_FIRST);
 $objIterator->setMaxDepth($this->_profundidadEscaneo);
 // Recorro los Archivos.
 foreach ($objIterator as $file) {
 if (is_file($file)) {
 $ext        = substr($file strripos($file '.')+1);
 if (in_array($ext $this->_tipoArchivos)) {
 $this->_resultados[$file->__toString()] = array('date'      => date("Y-m-d H:i"$obj_Directory->getATime())
 'dateUpdate'=> date("Y-m-d H:i"$obj_Directory->getMTime())
 'size'      => filesize($file)//$obj_Directory->getSize()
 'hash'      => sha1_file($file)
 'name'      => substr($file strripos($file DIRECTORY_SEPARATOR )+1)
 'nameSort'  => strtolower(substr($file strripos($file DIRECTORY_SEPARATOR )+1))
 'extencion' => substr($file strripos($file '.' )+1));
 }
 }
 }
 ksort($this->_resultados);
 }
 
 /**
 * Metodo _listarDirectorios.
 * Genera el arreglo de resultados correspondiente solo a directorios.
 * @return void
 */
 public function _listarDirectorios()
 {
 $objIterator = new RecursiveIteratorIterator($obj_Directory = new RecursiveDirectoryIterator($this->_dirba<x>se)
 RecursiveIteratorIterator::SELF_FIRST);
 $objIterator->setMaxDepth($this->_profundidadEscaneo);
 // Recorro los directorios.
 foreach ($objIterator as $file) {
 if (is_dir($file)) {
 $this->_resultados[$file->__toString()] = array('date'      => date("d-m-Y H:i"$obj_Directory->getATime())
 'dateUpdate'=> date("d-m-Y H:i"$obj_Directory->getMTime()));
 }
 }
 }
 
 /**
 * Metodo _listarTodo.
 * Genera el arreglo de resultados correspondiente a directorios y archivos.
 * @return void
 */
 public function _listarTodo()
 {
 $this->_listarDirectorios();
 $this->_listarArchivos();
 ksort($this->_resultados);
 }
 
 /**
 * Metodo getNombresArchivos.
 * Retorna solo los nombre de archivos.
 * @return array
 */
 public function getNombresArchivos()
 {
 $objIterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->_dirba<x>se)
 RecursiveIteratorIterator::SELF_FIRST);
 $objIterator->setMaxDepth($this->_profundidadEscaneo);
 // Recorro los Archivos.
 foreach ($objIterator as $file) {
 if (is_file($file)) {
 $ext        = substr($file strripos($file '.')+1);
 if (in_array($ext $this->_tipoArchivos)) {
 $this->_resultados[] = substr($file strripos($file DIRECTORY_SEPARATOR )+1);
 }
 }
 }
 return $this->_resultados;
 }
 
 /**
 * Metodo formatearSize.
 * Formatea la salida del tamaño de un archivo a una unidad mas estandarizada.
 * @version Desde Version 0.4.0 (28/11/2010)
 * @param   integer $tamanio    Tamaño del archivo en Bytes.
 * @param   integer $decimales  Decimales de la salida.
 * @param   boolean $uMedida    Si se pone la unidad de medida.
 * @return  string              Cadena Formateada.
 */
 public static function formatearSize($tamanio $decimales = 2  $uMedida = true) {
 $unidad     = array(' B' ' KB' ' MB' ' GB' ' TB' 'PB' 'EB' 'ZB' 'YB');
 $potencia   = floor(log((int)$tamanio) / log(1024));
 $formatSize = number_format($tamanio / pow(1024$potencia) (int) $decimales);
 $formatSize = ($uMedida)? $formatSize . $unidad[$potencia] : $formatSize;
 
 return $formatSize;
 }
 }
 
 
 Para ver su utilizacion: http://objetivophp.com/?p=100
 
 Autor: objetivophp.com
 
 http://objetivophp.esp.st (http://objetivophp.esp.st)
 
 Descarga: http://objetivophp.com/?p=100