Ver Mensaje Individual
  #1 (permalink)  
Antiguo 07/02/2009, 19:11
TiempoMuerto
 
Fecha de Ingreso: junio-2007
Mensajes: 70
Antigüedad: 16 años, 11 meses
Puntos: 2
De acuerdo [Aporte] Trabajando con el contenido de directorios (WCD v0.1)

Buenas, he desarrollado un conjunto de clases para que sea más fácil enfocar el hecho de tener que trabajar con el contenido de directorios. La finalidad de este aporte es facilitar una forma de trabajar con el contenido de directorios bastante eficaz y muy parametrizable. A continuación expongo el archivo LEEME, los códigos y donde descargar los fuentes. Espero que sea de utilidad!

Versión 0.2

Trabajando con el contenido de directorios (Working with the Contents of directories, WCD) es un conjunto de clases que pretende ayudar en una tarea simple que se le presenta a todo programador php alguna vez, realizar sobre ciertos ficheros de un directorio una cierta tarea. La idea general de trabajo con estas clases es, sobre un cierto directorio, recorrer los ficheros del mismo aplicándoles un filtro, y realizar sobre los ficheros que pasen el filtro una determinada acción. Todo ello con un cierto nivel de abstracción.

Con este simple fin se presentan tres clases:

- Clase Directorios, que entre otras características implementa el recorrido de un directorio elemento a elemento, ejecutando sobre aquellos que pasen un filtro una determinada acción.

Código PHP:

<?php

    
/* Clase que implementa la posibilidad de ejecutar una cierta función sobre los elementos de un directorio
    *     que superen un determinado filtro.
    *    
    *    Desarrollada por: José Raúl Ruiz Sarmiento.    Versión: 0.1
    *    
    *    Esta clase es de libre utilización y modificación para cualquier proposito, siempre y cuando no se
    *    elimine este texto. De ninguna manera se asegura el correcto funcionamiento de esta clase.
    *
    *    Cualquier aportación o detección de errores puede notificarse a: [email protected]        
    */
    
    
class Directorio{
    
        
/* Atributos de la clase */
        
        
private $ruta;
        private 
$filtro;
        private 
$ejectutor;
        
        
/* Constructor de la clase */
        
        
function __construct($ruta,$filtro=null,$ejecutor=null){
            
$this->ruta $ruta;
            
$this->filtro $filtro;
            
$this->ejecutor $ejecutor;
        }
        
        
/* Métodos para consultar y editar atributos privados de la clase */        
        
        
public function set_ruta($ruta){
            
$this->ruta $ruta;
        }
        
        public function 
get_ruta(){
            return 
$this->ruta;
        }
        
        public function 
set_filtro($filtro){
            
$this->filtro $filtro;
        }
        
        public function 
get_filtro(){
            return 
$this->filtro;
        }
        
        public function 
set_ejecutor($ejecutor){
            
$this->filtro $ejecutor;
        }
        
        public function 
get_ejecutor(){
            return 
$this->ejecutor;
        }
        
        
/* Función que ejecuta sobre los elementos del directorio $ruta que superen el $filtro la función
            $ejecutor. Devuelve el número de elementos sobre los que ha ejecutado el ejecutor.
            
            Para su correcto funcionamiento $ruta ha de contener la dirección del directorio a explorar,
            por ejemplo: "./img".  $filtro ha de ser un objeto de la clase Filtro correctamente inicializado
            según las necesidades. $ejecutor ha de contener un objeto de la clase Ejecutor correctamente
            inicializado según las necesidades. */
        
        
public function ejecutar()
        {
            if(!(
is_null($this->filtro)||is_null($this->ejecutor)))
            {
                
// Comprobamos si el directorio existe
                
if(is_dir($this->ruta))
                {
                    
// Abrimos el directorio
                    
$dir opendir($this->ruta);
                    
// Inicializamos el contador de ficheros procesados
                    
$contador 0;
                    
// Para cada uno de los elementos del directorio
                    
while ($elemento readdir($dir))
                    {
                        
// Comprobamos que no se trata del directorio padre ni del propio directorio
                        
if(($elemento!=".")&&($elemento!=".."))
                        {
                            
// Comprobamos si se trata de un fichero que tenemos que procesar pasandole el filtro
                            
if($this->filtro->filtrar($elemento))
                            {
                                
// Si el elemento pasa el filtro ejecutamos el ejecutor
                                
$this->ejecutor->ejecutar($elemento);
                                
$contador++;
                            }
                        }
                    }
                    
// Cerramos el directorio
                    
closedir($dir);
                    
// Devolvemos el número de ficheros procesados
                    
return $contador;
                }
                else
                {
                    echo 
"[ERROR]: Ruta del directorio especificado incorrecta";
                    return -
1;
                }
            }
            else
            {
                echo 
"[ERROR]: El filtro o la función ejecutora no han sido definidos";
            }
        
        }
    }



?>
- Clase Filtro, encargada de proporcionar los distintos filtros aplicables en la clase Directorios. Estos son los posibles filtros que han de pasar los elementos del directorio para que se les realice la acción.

Código PHP:

<?php

    
/* Clase que implementa el uso de filtros que han de superar los elementos de un cierto directorio para
    *    ejecutar sobre ellos el ejecutor.
    *    
    *    Desarrollada por: José Raúl Ruiz Sarmiento.    Versión: 0.1
    *    
    *    Esta clase es de libre utilización y modificación para cualquier proposito, siempre y cuando no se
    *    elimine este texto. De ninguna manera se asegura el correcto funcionamiento de esta clase.
    *
    *    Cualquier aportación o detección de errores puede notificarse a: [email protected]        
    */
    
    
class Filtro{
    
        
/* Atributos de la clase */
    
        
private $ruta;
        private 
$nombre_filtro;
        private 
$params;
        private 
$params_aux;
        
        
/* Constructor de la clase */
        
        
function __construct($ruta,$nombre_filtro,$params=null,$params_aux=null){
            
$this->ruta $ruta;
            
$this->nombre_filtro $nombre_filtro;
            
$this->params $params;
            
$this->params_aux $params_aux;
        }
        
        
/* Métodos para consultar y editar atributos privados de la clase */
        
        
public function set_ruta($ruta){
            
$this->ruta $ruta;
        }
        
        public function 
get_ruta(){
            return 
$this->ruta;
        }
        
        public function 
set_nombre_filtro($nombre_filtro){
            
$this->nombre_filtro $nombre_filtro;
        }
        
        public function 
get_nombre_filtro(){
            return 
$this->nombre_filtro;
        }
        
        public function 
set_params($params){
            
$this->params $params;
        }
        
        public function 
get_params(){
            return 
$this->params;
        }
        
        public function 
set_params_aux($params_aux){
            
$this->params_aux $params_aux;
        }
        
        public function 
get_params_aux(){
            return 
$this->params_aux;
        }
        
        
/* Función que ejecuta el filtro guardado en el atributo nombre_filtro sobre el elemento pasado como argumento.
            La función devolverá true si el $elemento pasa el filtro, false en caso contrario    */
                
        
public function filtrar($elemento){
        
            
$nombre =$this->nombre_filtro;
            return 
$this->$nombre($elemento);
            
        }
        
        
/* Filtro que devuelve siempre true. Se utilizará cuando queramos que el ejecutor se ejecute sobre todos los 
            ficheros del directorio */
        
        
private function filtro_no_filtrar($elemento){
            return 
true;
        }
        
        
/* Filtro que comprueba si el $elemento pasado como argumento a la función es de un determinado tipo.
        
            Para su correcto funcionamiento el atributo params en su posición cero (por ser pensado como
            un array que puede contener múltiples parámetros) ha de contener un
            array con los tipos de los que ha de ser elemento para pasar el filtro  */
        
        
private function filtro_es_de_tipo($elemento){
        
            
$tipos $this->params[0];
            
$nombre_fichero explode(".",$elemento) ;
            
$extension  $nombre_fichero[1] ;
            if(
in_array($extension$tipos))
                return 
true;
            else
                return 
false;
            
        }
        
        
/* Filtro que comprueba si el $elemento pasado como argumento a la función esde  mayor o menor tamaño en kb 
            que un determinado número.
            
            Para su correcto funcionamiento en el atributo de la clase $ruta tiene que estar almacenada la ruta
            hasta el elemento, ej: "./home/images". El atributo params en su posición cero (por ser pensado como
            un array que puede contener múltiples parámetros) ha de contener el modo de comparar, es decir, si van a pasar
            el filtro aquellos elementos de tamaño menor que el umbral que se pasa en la posición uno del atributo params
            (para el cual este modo de comparar ha de valer -1), si lo van a pasar los elementos de mismo tamaño que el umbral
            (valor del modo = 0), o si lo van a pasar los elementos de mayor tamaño que el umbral (modo = 1).   */
            
        
private function filtro_tamano_de_fichero($elemento){
        
            
$modo $this->params[0];
            
$umbral $this->params[1];
            
$tamano filesize(($this->ruta)."/".$elemento)/1024;
            
            if(
$modo==-1)
            {
                if(
$tamano $umbral)
                    return 
true;
            }
            else if(
$modo==0)
            {
                if(
$tamano == $umbral)
                    return 
true;
            }
            else if(
$modo==1)
            {
                if(
$tamano $umbral)
                    return 
true;
            }
            return 
false;
        }
        
        
/* Filtro que comprueba si el fichero pasado por el argumento $elemento se corresponde con el fichero
            que estoy buscando, almacenado en la posición cero del array $params.    */
            
        
private function filtro_es_fichero_buscado($elemento){
        
            return (
$this->params[0]==$elemento);
        }
        

    
    }


?>

Última edición por TiempoMuerto; 08/02/2009 a las 09:49