Gestión de directorios por PHP

Aprendemos a navegar por la arborescencia de directorios del sistema de archivos del servidor.
Siguiendo con la saga de artículos referentes a la explotación de archivos por medio de PHP, vamos a presentar algunas funciones que nos pueden ser muy útiles en la navegación por directorios. Este tipo de funciones podrían, por ejemplo, servirnos para crear exploradores de archivos en nuestro navegador.

Funciones de gestión de directorios
Función Descripción Sintaxis
opendir Abre un directorio situado en $path y le asigna un identificador $dir $dir = opendir($path)
readdir Lee un elemento del directorio $dir abierto previamente con opendir y desplaza el puntero al elemento siguiente readdir($dir)
rmdir Elimina el directorio $dir rmdir($dir)
mkdir Crea un directorio situado en $path con los derechos de acceso $derechos (entero) mkdir($path, $derechos)
rewinddir Vuelve el puntero de lectura del directorio $dir al primer elemento rewinddir($dir)
closedir Cierra el directorio $dir abierto previamente con opendir closedir($dir)

La forma de tratar con estas funciones es la similar a la que ya hemos visto para le lectura secuencial de archivos. Podemos distinguir tres etapas elementales:
  • Apertura del directorio por medio de la función opendir asignándole al mismo tiempo un identificador
  • Realización de las tareas necesarias en relación con ese directorio
  • Clausura del identificador por medio de la función closedir
A notar que, para que un directorio pueda ser borrado, hace falta previamente haber eliminado cada uno de los elementos contenidos dentro del directorio. Para esto, nos podemos servir de la función unlink, presentada en otor artículo.

Por otra parte, la creación de un directorio por medio de la función mkdir requiere la definición de los derechos de acceso por medio de un numero entero. Esperamos poder explicar en qué consisten estos derechos próximamente.

Como ejemplo sencillo de lo que podemos hacer con estas funciones, aquí os presentamos un pequeño script de lectura que os permite visualizar el contenido de un directorio:

<?
//definimos el path de acceso
$path = "mi/camino";

//abrimos el directorio
$dir = opendir($path);

//Mostramos las informaciones
while ($elemento = readdir($dir))
{
   echo $elemento."<br>";
}

//Cerramos el directorio
closedir($dir);
?>

Otra forma de abordar la gestión de directorios es por medio de la clase dir que permite la creación de un objeto sobre el cual podremos aplicar toda una serie de métodos equivalentes a las funciones previamente vistas. Si estas familiarizado con la programación orientada a objetos, puede que esta modalidad te resulte mas intuitiva. Si no sabes en qué consiste la programación orientada a objetos, puedes visitar este artículo.

En este caso, la forma de operar es análoga a la ya vista:
  • Creamos un objeto $dir con la instrucción: $dir = dir($path)
  • Realizamos las tareas necesarias llamando a los métodos de la clase dir
  • Cerramos el directorio con el método close
Algunos de los métodos que podemos utilizar con esta clase son los siguientes:

Métodos de la clase dir
Método Descripción Sintaxis
path Indica el path del directorio $objeto->path
read Lee un elemento del directorio $objeto->read
rewind Vuelve el puntero de lectura del directorio al primer elemento $objeto->rewind
close Cierra el directorio $objeto->close

Como ejemplo, he aquí el script equivalente al abordado para el caso de las funciones, esta vez usando la clase dir:

<?
//definimos el path de acceso
$path="mi/camino/";

//instanciamos el objeto
$dir=dir($path);

//Mostramos las informaciones
echo "Directorio ".$dir->path.":<br><br>";

while ($elemento = $dir->read())
{
   echo $elemento."<br>";
}
//Cerramos el directorio
$dir->close();
?>

Los scripts propuestos no son más que ejemplos sencillos de lo que estas funciones pueden ofrecernos. En vuestras manos queda el combinar estas funciones con otras vistas en este mismo taller de manera a crear aplicaciones que gestionen los archivos y directorios de vuestro servidor.

Recordamos que esta lista no es más que una recopilación y que muchas otras funciones relacionadas pueden sernos también útiles.

Autor

Rubén Alvarez

Rubén es doctor en química y programador aficionado con experiencia en PHP.

Compartir

Comentarios

Marketeam

01/10/2004
En el articulo aparece el siguiente link http://www.php.net/manual/en/ref.filesystem.php que es para entrar a la versión en ingles. Para ver la versión en español es necesario cambiar el "en" por "es" (http://www.php.net/manual/es/ref.filesystem.php)
Espero que les sirva

Greco2

24/7/2006
Hola, yo necesitaba tambien una funcion o algo que me verifique si el directorio existe y evitar crearlo y lo que hice fue lo siguiente:

<?php
$dir="chat2";
if (!is_dir($dir)){
@mkdir($dir, 0777);
echo "se creo el directorio: ".$dir;
}else{
echo "existe el directorio: ".$dir;
}
?>

lo probe y funciona perfecto, espero les sirva.

Greco2

24/7/2006
estuve mirando por ahi y creo que seria mejor comprovar la existencia de un directorio de esta forma y no como lo puse en el mensaje anterior:

<?php
$dir="nombre_dir";
if (!file_exists($dir)){
@mkdir($dir, 0777);
echo "se creo el directorio: ".$dir;
}else{
echo "existe el directorio: ".$dir;
}
?>
usando file_exist y no is_dir

soy novato asi que me equivoque pero en todo caso tambien funciona :)

alfonso

16/12/2009
sintaxis en los ejemplos
Bien explicado pero ocupan algunos signos q pueden ser mal interpretados por cualquier usuario como $dir->read()) esta"->" me indica que es igual a?, dentro del () va el nombre de mi archivo?

16/12/2009
Manejo de archivos local y en red es lo mismo?
declarar variables como $path y $fopen serviran para abrir cualquier archivo? , se usan solo para aplicaciones locales? o incluso en una red wan?sera capas php de crear una aplicacion como ftp o para manejar un hosting?
si alguien tiene por lo menos una respuesta favor de publicarla o responder a este comentario

ljpalmer

04/8/2010
Manejo de Archivos con PHP
Respondiendo al comentario anterior pues php es capas de crearlo con los actuales componentes que abundan por la internet, un claro ejemplo de ello es este proyecto para gestionar archivos que tambien tiene un modo FTP. Revisenlo pueden interesarles a muchos y si no quitarles un dolor de cabeza al iniciar el desarollo de algo que ya esta hecho:
http://extplorer.sourceforge.net/

eric

17/11/2010
buscar archivos
<?php
//definimos el path de acceso
$path = "c:/";

//abrimos el directorio
$dir = opendir($path);

//Mostramos las informaciones
while ($elemento = readdir($dir))
{

print("<a href='$elemento'>$elemento</a><br/>");
}

//Cerramos el directorio
closedir($dir);
?>

tengo este codigo php que me muestra los rachivos de mi disco c: como puedo hacer que me los mustre en el explorador los txt o los work,excel los descargue

cris

07/10/2011
Problema con el listado
Hola q tal he usado el código para ver que tal me va, y me topado con que al listar el script agrega dos lineas con " .. " y " . " (puntos) alguien sabe por que? el código es:

<?php

$path="public-files/foto/";
$dir=dir($path);
$root=$dir->path;
while ($elemento = $dir->read()){
$mini_img="";
$mini_img=$mini_img."<a rel='main_gallery' href='".$root."/".$elemento."' title=''>";
$mini_img=$mini_img."<img src='".$root."/".$elemento."' width='70' height='57' alt='' />";
$mini_img=$mini_img."</a>";
echo $mini_img;
}
$dir->close();

?>

Gracias

Arturo

24/5/2012
Sobre Mostrar archivos de un directorio
Hola a todos, gracias por los ejemplos de cómo mostrar los archivos de un directorio, me ha servido de mucho para un sitio de descarga y aquí les pongo el arreglado por mí que hasta el momento me ha funcionado correctamente...<br />
&lt;?<br />
$path=&quot;Descarga/Tesis M&quot;;<br />
$dir = opendir($path);<br />
<br />
//Mostramos las informaciones<br />
while ($file = readdir($dir))<br />
{<br />
if ($file!=&quot;.&quot; &amp;&amp; $file!=&quot;..&quot;){<br />
$a=filesize(&quot;$path/$file&quot;); <br />
$type=filetype(&quot;$path/$file&quot;); <br />
$est= substr(strrchr($file,&#039;.&#039;),1); <br />
if ($est==&quot;pdf&quot;){<br />
$imag= &#039;/Images/pdf.gif&#039;;<br />
}elseif ($est==&quot;doc&quot;){<br />
$imag= &#039;/Images/doc.gif&#039;;<br />
}elseif ($est==&quot;rar&quot;){<br />
$imag=&#039;/Images/rar.gif&#039;;<br />
}elseif ($est==&quot;ppt&quot;){<br />
$imag=&#039;/Images/ppt.gif&#039;;<br />
}elseIf ($type==&quot;dir&quot;){<br />
$imag=&#039;/Images/folder.gif&#039;;<br />
} <br />
echo &quot;&lt;tr&gt;&lt;td&gt;&quot;.&quot;&lt;img src=&#039;$imag&#039;&gt;&quot;.&quot;&lt;/td&gt;&lt;td&gt;&quot;;<br />
<br />
print(&quot;&lt;a href=&#039;$path/$file&#039; target=&#039;_blank&#039;&gt;$file&lt;/a&gt;&lt;br/&gt;&quot;);$a;<br />
$b=1000;<br />
$kb=$a / $b;<br />
echo &quot;&lt;td&gt;&lt;a&gt;&quot;.$kb.&quot; Kb&lt;/a&gt;&quot;.&quot;&lt;/td&gt;&lt;/tr&gt;&quot;;<br />
}<br />
}<br />
<br />
//Cerramos el directorio<br />
closedir($dir);<br />
?&gt;<br />
solo me gustaría saber como disminuir la longitud de caracteres en el tamaño de los ficheros...<br />
Gracias...