Cómo hacer el mapa de un sitio web

Antes que nada, debemos ocuparnos de realizar las funcionalidades más básicas: queremos obtener algo que pueda escanear carpetas y devolver nombres de archivos. Como no sabemos cuántas carpetas deberán ser procesadas y hasta dónde tendremos que bajar, aplicaremos un método recursivo. El código en el Listado 1 hace aquello para lo que fue creado: escanear.

Listado 1: Script para escanear carpetas
$handle = opendir('.');
while ($file = readdir($handle))
{
   if(is_dir($file) && $file != "." && $file != "..")
      $sdirs[] = $file;
      elseif(is_file($file) && $file != basename($PHP_SELF))
      $sfiles[] = $file;

//aquí agregamos la línea gracias a la cual se ven los primeros resultados
//– véase Figura 1
print "$file<br>";
}
Figura 1: Efecto de la ejecución del script del Listado 1

En la primera línea se abre el directorio actual, después de lo que se ejecuta un bucle que lee todos los elementos de este directorio. Tenemos que separar los archivos de los directorios porque estos últimos también deberán ser escaneados de manera recursiva. Las entradas “.” y “..” así como el script mismo serán excluidos.

A partir de este enfoque implementaremos una función recursiva, la cual se invocará a sí misma para cada elemento del array $sdirs[] y a la salida devolverá datos que puedan ser después verificados. La única cosa que debemos tener en cuenta es el hecho de que $PHP_SELF es una variable global, así que tiene que ser declarada como tal al inicio de la función. Nuestra función debe recibir como argumento el directorio a escanear. Antes de invocarla podemos asegurarnos de que este directorio sea el actual, o bien pasar su ruta de acceso como argumento a la función opendir(); el cambio del directorio actual se realiza con ayuda de la función chdir() (véase Listado 2 o 3).

Listado 2: Cambio del directorio actual
function list_dir($chdir)
{
  ...
  chdir($chdir);
  ...
  $handle = opendir('.');
  ...
}
Listado 3: Otra manera de cambiar el directorio actual
function list_dir($chdir)
{
  ...
  $handle = opendir($chdir);
  ...
}

Como no hay necesidad de realizar ningún otro tipo de procesamiento de los archivos y directorios encontrados, el contenido de los arrays $files[] y $sdirs[] no tiene por qué ser devuelto.

En este momento, el siguiente trozo de código es responsable de la visualización de los datos que nos interesan:

for($i=0; $i<sizeof($sdirs); $i++)
  echo "$sdirs[$i]<br>";
for($i=0; $i<sizeof($sfiles); $i++)
  echo "$sfiles[$i]<br>";

¿Y si es necesario hacer algo más con los archivos, por ejemplo clasificarlos según su tamaño? Basta con devolver los arrays con archivos y directorios y no visualizar el resultado inmediatamente. Sin embargo, el almacenamiento de estos datos requiere de no poca habilidad: sería necesaria una estructura mucho más compleja que un simple array. Podemos, por ejemplo, hacer uso de un array tridimensional donde las claves sean los nombres de los directorios, y los valores de los arrays con el contenido de esos directorios. Probablemente esto afectará negativamente la velocidad de funcionamiento del script, además de consumir una cantidad mayor de memoria. Personalmente no utilizaría este tipo de programa para generar el mapa de un sitio, no solamente por las razones (económicas) mencionadas más arriba, sino también porque el procesamiento de los datos recogidos será bastante difícil.

Avanzando en la exploración recursiva del árbol de directorios, llegará un momento en que tendremos que determinar el lugar preciso en que nuestra función se llamará a sí misma. Puesto que los directorios deben aparecer antes que los ficheros, haremos esta llamada tal y como podemos ver en el Listado 4.

Listado 4: Lugar de invocación de la función
$dir = getcwd();
for($i=0; $i<sizeof($sdirs); $i++)
{
   echo "$sdirs[$i]<br>";
   list_dir($dir."/".$sdirs[$i]);
}

Cada vez que terminemos de escanear un directorio, cambiaremos el directorio actual al siguiente que deseamos procesar. Añadiremos, pues:

chdir($chdir);

Recordemos que $chdir es la variable que la función list_dir() recibió como argumento.

Cuando hayamos hecho todo esto, bastará con invocar la función con el nombre de un directorio como argumento, para que todos sus subdirectorios sean también escaneados (para obtener el nombre del directorio actual haremos uso de getcwd() (ver Listado 5))

Listado 5: Obtención del nombre del directorio actual
function list_dir($chdir)
{
   [implementación de la función]
}
$cwd = getcwd();
list_dir($cwd);

COMPARTE ESTE ARTÍCULO

ENVIAR A UN AMIGO
COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN GOOGLE +
¡SÉ EL PRIMERO EN COMENTAR!
Conéctate o Regístrate para dejar tu comentario.