Comunidad PHPeros

Lenguajes => PHP => (POO) Programación Orientada a Objetos => Mensaje iniciado por: marco811 en 10 de Mayo de 2010, 12:50:56 pm

Título: Clase para escanear directorios y subdirectorios.
Publicado por: marco811 en 10 de Mayo de 2010, 12:50:56 pm
Buenas  :D Os vengo a presentar esta clase que he creado y que sirve para escanear los directorios y subdirectorios de una ruta  :P También sirve para buscar texto dentro de los archivos que se han escaneado.

¿Como funciona?
Pues muy fácil:

$dir = new dirscan;
$dir->scandir('/home/s0205e3f/public_html/', true);

El segundo argumento es si quieres que se escaneen también los subdirectorios, dejalo a true si es asi, sino cambialo a false o simplemente no lo pongas.

¿Como busco un texto dentro de los archivos? poniendo $this->seach($path, 'texto a buscar'); dentro de la funcion file_action

function file_action($path) {
$this->search($path, 'texto a buscar');
}


Como muestro por pantalla la lista de directorios/archivos? Poniendo echo $path; dentro de las funciones file_action y dir_action  :D
Si quereis que os escanee el directorio actual, basta con poner getcwd() en vez de la ruta del directorio que queremos escanear.

Código de la clase:

<?php
class dirscan {
function scandir($path, $sscan=false) {
if(strrpos($path, '/')) $gb = '/';
if(strrpos($path, chr(92))) $gb = chr(92);
if(substr($path, -1)!=$gb) $path = $path.$gb;
$dir = scandir($path);
foreach(array_splice($dir,2,count($dir)-1) as $file) {
if(is_dir($path.$file)==false) $this->file_action($path.$file);
if(is_dir($path.$file)==true and $sscan==true) $this->dir_action($path.$file);
}
}

function file_action($path) {

}

function search($path, $search) {
ob_start();
if(filesize($path)<104857) $filec = file_get_contents($path);
if(strrpos($filec, $search)) exit("Archivo encontrado. ".$path);
ob_end_clean();
}

function dir_action($path) {
$this->scandir($path, true);
}

}

?>

Bueno, esto es todo! Si teneis alguna sugerencia no dudéis en postearla mas abajo!
Un saludo!
Título: Re:Clase para escanear directorios y subdirectorios.
Publicado por: javipilo en 10 de Mayo de 2010, 13:09:10 pm
Muy bueno pero te comiste una r $this->seach($path, 'texto a buscar'); por $this->search($path, 'texto a buscar');
Título: Re:Clase para escanear directorios y subdirectorios.
Publicado por: marco811 en 10 de Mayo de 2010, 13:11:00 pm
Es verdad, ahorita lo cambio !
Título: Re:Clase para escanear directorios y subdirectorios.
Publicado por: javipilo en 10 de Mayo de 2010, 13:15:14 pm
Además te queda una cosa muy guapo si le pones GETS, y puedes explorar xD, le he puesto también un icono de carpeta jajaja.

Saludos
Título: Re:Clase para escanear directorios y subdirectorios.
Publicado por: marco811 en 10 de Mayo de 2010, 13:24:54 pm
Además te queda una cosa muy guapo si le pones GETS, y puedes explorar xD, le he puesto también un icono de carpeta jajaja.

Saludos
Si. he pensado hacer un script que muestre las carpetas del servidor, y que sea muy parecido al de windows. Tambien que tenga la herramienta de buscar archivos, copiar, pegar, mostrar miniaturas de las imagenes, etc..! Igual que un explorador de windows!  :P :D pero me da mucha pereza!
Título: Re:Clase para escanear directorios y subdirectorios.
Publicado por: javipilo en 10 de Mayo de 2010, 13:38:26 pm
Yo haría algo tipo Tortoise SVN, xD, para nos que no lo sepan es un servidor donde subes los proyectos y todo eso.

Saludos
Título: Re:Clase para escanear directorios y subdirectorios.
Publicado por: CarlosRdrz en 10 de Mayo de 2010, 15:41:35 pm
¿Para que sirve la clase, si ninguno de sus métodos devuelve nada?

Esta bien para practicar pero se tiene que mejorar mucho, la idea es que una vez que tengas una clase no tengas que modificar nada del código de esta, y todo se maneje llamando a los métodos con parámetros diferentes.

Además, tambien hay muchas cosas extrañas, por ejemplo en esta linea de la función scandir
if(is_dir($path.$file)==true and $sscan==true) $this->dir_action($path.$file);
Que resulta que luego dir_action lo que hace es volver a llamar a scandir.
No es necesario hacer eso, puedes llamar desde la función scandir a la propia función scandir. Es algo que en programación se llama recursividad

Puedes buscar algo sobre la recursividad en php en google, seguro que encuentras muchas cosas interesantes :)

Saludos!
Título: Re:Clase para escanear directorios y subdirectorios.
Publicado por: marco811 en 10 de Mayo de 2010, 15:48:00 pm
Además, tambien hay muchas cosas extrañas, por ejemplo en esta linea de la función scandir
if(is_dir($path.$file)==true and $sscan==true) $this->dir_action($path.$file);
Que resulta que luego dir_action lo que hace es volver a llamar a scandir.
No es necesario hacer eso, puedes llamar desde la función scandir a la propia función scandir. Es algo que en programación se llama recursividad

Puedes buscar algo sobre la recursividad en php en google, seguro que encuentras muchas cosas interesantes :)

Saludos!
No has entendido mi condigo. Vuelve a llamar a la funcion scandir solamente en caso que el usuario quiera escanear tambien los subdirectorios. La funcion dir_action puede ser util cuando el programador quiere hacer un script para mover/copiar directorios y la funcion file_action tambien en caso de que se quiera buscar una cadena de texto en casa uno de los archivos que van a ser procesados. Ya lo se que se puede hacer tambien desde la funcion scandir, pero prefiero hacerlo de forma mas ordenada. Cada programador tiene su manera de hacer las cosas.
Un saludo.
Título: Re:Clase para escanear directorios y subdirectorios.
Publicado por: CarlosRdrz en 10 de Mayo de 2010, 16:21:31 pm
Amigo, no te ofendas, pero me parece que si he entendido tu código, el problema es que tu no has entendido mi crítica (que por ser crítica no quiere decir que sea atacando).

Hacer esto:

function dir_action($path) {
$this->scandir($path, true);
}


No es ser ordenado, ni hacerlo porque es tu forma de hacer las cosas. Para mi punto de vista eso son líneas inútiles, no tienen ninguna utilidad. Simplemente es como llamar a la función scandir con otro nombre, es decir, llamarla de dos formas, scandir y dir_action, pero ambas hacen la misma cosa.

La función file_action es aún mas inútil, ni siquiera hace nada, simplemente está declarada y ni recibe parámetros ni tampoco devuelve ninguna información. Debo suponer por tanto que esa función está para que la implemente alguien, pero te digo que eso no tiene utilidad, si alguien quiere implementar algo lo hará fuera de tu clase. La clase no tiene por qué tocarse si no es para actualizarse o modificarse directamente.

Según entiendo por tu código, se supone que la función file_action y dir_action debe implementarla el programador que use la clase, para que haga una u otra cosa sobre los archivos o bien sobre los directorios. ¿Entonces que utilidad tiene la clase, si tengo que implementar yo lo que hará y lo que dejará de hacer?

No se si consigo explicarme. No es que no entienda tu clase o que no tenga utilidad, quizás ahí me he explicado mal, pero lo cierto es que tiene una utilidad muy limitada. El problema de la clase no es de código, ni de sintaxis ni de falta de conocimientos, el problema es que está mal planteada. En lugar de declarar una clase con todos sus métodos correctamente definidos y delimitados, has hecho una ensalada de diferentes códigos para que alguien la modifique según para que la vaya a utilizar y demás, pero bajo mi punto de vista ese no es el objetivo que se persigue al crear una clase.

Para nombrar algo, uno de los principios de la POO es que el código se convierte en reutilizable y por lo tanto se puede utilizar en muchas aplicaciones, pero si te das cuenta ese principio no aparece en tu código. En tu clase habrás de modificar los métodos según los utilices para una u otra cosa, por lo tanto pierde completamente ese principio de "reciclar código".

En fin, respecto a la sintaxis, la programación y la imaginación muy bien, pero te faltan esos conocimientos teóricos que bajo mi punto de vista han hecho que la clase que has creado pierda su esencia. Puede ser útil, vale, pero no creo que cumpla los objetivos que se persiguen al crear una clase. Te recomiendo leer algo sobre la teoría de la programación orientada a objetos, modelos para construirla y las mejores formas de plantear los problemas y las soluciones.

Espero que no te tomes mal mi mensaje, solo trato de ayudarte a mejorar,
Saludos!
Título: Re:Clase para escanear directorios y subdirectorios.
Publicado por: Warlox en 10 de Mayo de 2010, 20:18:49 pm
Me gusta, aunque como dice TLX, casi no tiene un valor práctico, de hecho es más para practicar.
De todos modos, te dejo un Karma por el esfuerzo realizado ;)
Título: Re:Clase para escanear directorios y subdirectorios.
Publicado por: marco811 en 11 de Mayo de 2010, 11:21:09 am
No me he ofendido :) Tienes razon, talvez deberia modificar la clase para que el usuario no se tenga que molestar en hacer nada. Gracias por el karma Kevin.
Un saludo!
Título: Re:Clase para escanear directorios y subdirectorios.
Publicado por: marco811 en 13 de Mayo de 2010, 14:02:53 pm
Además te queda una cosa muy guapo si le pones GETS, y puedes explorar xD, le he puesto también un icono de carpeta jajaja.

Saludos
Sorry por doble post:
Ya empeze a hacer lo que te decia antes, que te parece?
Imagen:
(http://www.personalidad-web.net/phexplore.jpg)
Título: Re:Clase para escanear directorios y subdirectorios.
Publicado por: Warlox en 13 de Mayo de 2010, 19:40:04 pm
¡¡Está genial!!