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";
}
}
}
?>
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);
}
}
?>