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

COMPARTIR EN FACEBOOK
COMPARTIR EN TWITTER
COMPARTIR EN LINKEDIN
COMPARTIR EN WHATSAPP