En el post de hoy voy a dejar aquí colgado un pequeño código en el que se desarrolla un navegador de archivos creado con PHP. Trabajar con archivos y sus cosas en php se parece horriblemente a como trabajar con archivos con Python. No se trata de algo muy elaborado ni demasiado bonito. Pero después de haberlo probado más de una y de dos veces en un servidor local, puedo decir que funciona correctamente.
Actualmente lo único que hace es mostrar un listado de los archivos y directorios que encuentre. En principio en la carpeta dónde se encuentre nuestro archivo .php. Nos permitirá movernos por toda la estructura de directorios que tengamos.
Creando un navegador con PHP
<?php //Funciones: //pon_url //es_directorio /******/ //las imagenes que se usan vienen dentro de xampp en el directorio icons. Fuera de htdocs. //Función para establecer la dirección correcta function pon_url($un_dir, $un_item) { $ini_etiq = "<a href='${_SERVER["PHP_SELF"]}?nuevo_dir"; //la primera parte de la dirección $fin_etiq = "</a><br>"; if ($un_item == "..") { //en caso de que $un_item sea .. //contamos hasta 1 if (substr_count($un_dir, "/") >= 1) { $un_dir = strtr(dirname($un_dir), "\\", "/"); // Win devuelve '/' //acabamos de formar la dirección con esta segunda parte y la imagen de los dos puntos echo "<img src='/icons/back.gif'>$ini_etiq=$un_dir'><font size=+2>..</font>$fin_etiq"; } } else { //si $un_item no es .. if ($un_dir == "/") { //preguntamos si $un_dir es la raíz //formamos la url con esta segunda parte de la url y su correspondiente icono echo "<img src='/icons/folder.gif'>$ini_etiq=/$un_item'>$un_item$fin_etiq"; } else { //se forma la dirección con esta segunda parte de la url y su icono. //la / aparece enmedio de $un_dir y $un_item echo "<img src='/icons/folder.gif'>$ini_etiq=$un_dir/$un_item'>$un_item$fin_etiq"; } } } // en windows no puede haber un nombre de directorio con dos '/' esto '//' está mal function es_directorio($un_dir, $un_item) { //recibe dos parámetros if ($un_dir == '/') { //si $un_dir es / //se le antepone / al nombre del item ya que es la raíz del la estrucutra //de directorios $fich_a_preguntar = "/$un_item"; } else { //sinó es / suponemos que no es la raíz de la estructura de directorios //y por eso / separará el nombre del directorio del nombre del item $fich_a_preguntar = "$un_dir/$un_item"; } return (is_dir("$fich_a_preguntar")); //devolvemos true o false según sea o no un directorio } if (isset($_GET['nuevo_dir'])) { $nuevo_dir = $_GET['nuevo_dir']; } else { // es la primera vez que se ejecuta el script $nuevo_dir = getcwd(); //getcwd nos devuelve el directorio actual de trabajo if (isset($_SERVER["WINDIR"])) { $nuevo_dir = substr($nuevo_dir, 2); // quitamos las 2 letras de la unidad $nuevo_dir = strtr($nuevo_dir, "\\", "/"); //cambiamos las \\ por / } } //mostramos la nueva url de la dirección eb ka parte superior echo "<h2>CARPETA: <i>$nuevo_dir</i></h2>"; //si no se puede abrir el directorio ($nuevo_dir) se muestra el mensaje, sinó se pasa al while. //se abre el directorio con el comando opendir if (!$df_dir = opendir($nuevo_dir)) { die("<h3>*** ERROR: no se ha podido entrar en ($nuevo_dir)</h3>"); } //si se puede leer el directorio se hace el while while (($item = readdir($df_dir)) !== false) { if ($item == ".") { //en caso de que $item sea . se salta a la siguiente iteración del bucle continue; } if (es_directorio($nuevo_dir, $item)) { //si la función es_directorio devuelve true se le pasan los parámetros //$nuevo_dir e $item a la función pon_url pon_url($nuevo_dir, $item); } else { //en caso de que el item sea un archivo se le añade el incono generic. echo "<img src='/icons/generic.gif'>$item<br>"; } } closedir($df_dir); //cerramos el directorio ?>