Hogar / Consolas de juegos / PHP obtiene el último archivo agregado en las subcarpetas. Obtener una lista de archivos y directorios usando PHP. Uso de iteradores SPL

PHP obtiene el último archivo agregado en las subcarpetas. Obtener una lista de archivos y directorios usando PHP. Uso de iteradores SPL

En esta lección nos ocuparemos de una tarea típica que surge al trabajar en un proyecto PHP: obtener una lista de archivos y directorios. Discutiremos varios enfoques básicos y más sofisticados, enumerando los pros y los contras de cada uno. Las primeras tres soluciones utilizarán funciones PHP estándar y luego presentaremos una más sólida que utiliza iteradores SPL.

Para una discusión sustancial de la solución y demostraciones, asumiremos que la estructura del directorio es la siguiente:

\---gerente | \---usuario | \---documento.txt | \---datos.dat | \---estilo.css |---artículo.txt |---master.dat |---script.php |---test.dat |---texto.txt

Soluciones básicas

El primer conjunto de soluciones se basa en el uso de la función glob(), una combinación de las funciones opendir(), readdir() y closedir(), y también la función scandir().

Usando globo()

La primera solución se basa en el uso de la función glob(), que permite buscar rutas mediante patrones. La función tiene dos parámetros:

  • $patrón (obligatorio): patrón de búsqueda
  • $flags (opcional): una o más banderas, cuyas descripciones se pueden encontrar en la documentación

Veamos ejemplos. Para buscar en un directorio todos los archivos y directorios cuyos nombres terminan con .TXT, deberías usar el código:

Si mostramos la variable $filelist, obtenemos:

Matriz (0 => "artículo.txt", 1 => "texto.txt")

Si necesita una lista de archivos y directorios cuyos nombres comienzan con "te", el código se verá así:

Y el resultado se ve así:

Matriz (0 => "prueba.dat", 1 => "texto.txt")

Y para obtener una lista de directorios con nombres que contienen "ma", use el código:

El último ejemplo generará:

Matriz (0 => "administrador")

Tenga en cuenta que el último ejemplo utiliza el indicador GLOB_ONLYDIR como segundo parámetro de la función. Por lo tanto, el archivo master.dat está excluido de la lista. Aunque la función glob() es muy fácil de usar, a veces no es lo suficientemente flexible. Por ejemplo, no hay ningún indicador para obtener sólo archivos (sin directorios) que coincidan con el patrón.

Usamos opendir() , readdir() y closedir() .

El segundo método para obtener una lista de archivos y directorios que analizaremos es utilizar las funciones opendir(), readdir() y closedir().

La función opendir() abre un directorio y devuelve un identificador de conexión. Una vez que se obtiene el identificador, se puede utilizar la función readdir(). Con cada llamada, esta función devuelve el nombre del siguiente archivo o directorio dentro del directorio abierto. Si ya se han enumerado todos los nombres, la función devuelve FALSO. La función closedir() se utiliza para cerrar el identificador.

A diferencia del uso de la función glob(), este enfoque es más complejo porque no tiene parámetros para ayudar a filtrar la lista de nombres de archivos y directorios que se devuelven. Debe realizar el filtrado usted mismo para obtener los resultados que desea.

El siguiente ejemplo devuelve una lista de nombres de archivos y directorios que comienzan con "te":

Cuando ejecute el código anterior, la variable $entry contendrá inclusiones como "." Y "..". Estos son dos directorios virtuales que existen en cada directorio. sistema de archivos. Representan el directorio actual y el directorio principal respectivamente.

El segundo ejemplo muestra solo los archivos contenidos en el directorio dado.

El ejemplo producirá lo siguiente:

Matriz (0 => "artículo.txt", 1 => "master.dat", 2 => "script.php", 3 => "test.dat", 4 => "text.txt")

Usando scandir()

Finalmente, introduzcamos la función scandir(). Sólo tiene un parámetro obligatorio: la ruta de lectura. La función devuelve una matriz de archivos y directorios ubicados en la ruta especificada. Para obtener una lista de archivos y directorios según un criterio específico, debe realizar un filtrado adicional. Por otro lado, la solución es más concisa y no requiere gestión de manejo.

Este ejemplo muestra cómo obtener una lista de archivos y directorios cuyos nombres comienzan con "te":

Usemos iteradores SPL

Ahora veamos el uso de iteradores SPL. Pero antes de comenzar a resolver nuestro problema, demos una introducción a la biblioteca SPL y a los iteradores. La biblioteca SPL proporciona una serie de clases para estructuras de datos orientadas a objetos, iteradores, descriptores de archivos y más.

Uno de los beneficios de los iteradores es que son clases y pueden ampliarse para satisfacer sus propias necesidades. Otra ventaja es que los iteradores tienen sus propios métodos, que son útiles para resolver muchos problemas comunes y están ubicados en un solo lugar. Mire un ejemplo del uso de FilesystemIterator versus readdir() . Ambos métodos usan un bucle, pero con readdir() solo procesas una cadena, mientras que FilesystemIterator trabaja con un objeto que puede contener información adicional sobre el archivo o directorio (tamaño, propietario, permisos, etc.).

Por supuesto, PHP ofrece la posibilidad de obtener dicha información utilizando funciones como tamaño de archivo() y fileowner(). Pero PHP5 se basa en el uso del concepto de programación orientada a objetos. Por eso es mejor utilizar métodos modernos Trabajar con un lenguaje de programación. Hay lecciones sobre cómo trabajar con iteradores en nuestro sitio web.

Como ya se indicó en la parte acuosa del tutorial, cubriremos el uso de FilesystemIterator, RecursiveDirectoryIterator y GlobIterator. El primero hereda de DirectoryIterator y el resto de FilesystemIterator. Todos tienen el mismo constructor, que toma dos parámetros:

  • $path (obligatorio): ruta a la entrada del sistema de archivos en la que se realizan las operaciones
  • $flags (opcional): una o más banderas enumeradas en la documentación

La verdadera diferencia entre estos iteradores es cómo se utilizan para navegar por un camino determinado.

Sistema de archivosIterador

Usar FilesystemIterator es muy simple. Veámoslo en acción. Presentamos dos ejemplos. El primero muestra una búsqueda de todos los archivos y directorios cuyos nombres comienzan con “te”. El segundo ejemplo utiliza otro RegexIterator para buscar todos los archivos y directorios cuyos nombres terminan en "t.dat" o "t.php". RegexIterator se utiliza para filtrar el resultado en función de expresiones regulares.

getFilename(), "te") === 0) ( $filelist = $entrada->getFilename(); ) )

El código anterior producirá un resultado similar a los ejemplos anteriores.

Segundo ejemplo usando RegexIterator:

getFilename(); )

Dará salida:

Matriz (0 => "script.php", 1 => "test.dat")

RecursivoDirectorioIterador

RecursiveDirectoryIterator proporciona una interfaz para recorrer de forma recursiva los directorios del sistema de archivos. Tiene varios métodos útiles, como getChildren() y hasChildren(), que devuelven un iterador para la ubicación actual si es un directorio y verifican si el punto de entrada actual es un directorio. El siguiente ejemplo demuestra el uso de RecursiveDirectoryIterator y getChildren() . El resultado será el mismo que en los ejemplos anteriores.

getChildren(), "/t\.(php|dat)$/"); $lista de archivos = matriz(); foreach($filtro como $entrada) ( $lista de archivos = $entrada->getFilename(); )

GlobalIterador

GlobIterator itera a través del sistema de archivos de la misma manera que la función glob(). El primer parámetro puede incluir un patrón para el nombre. El ejemplo demuestra el uso de GlobIterator con el mismo resultado que antes.

getFilename(); )

Conclusión

Esta lección demuestra el uso de diferentes enfoques para lograr el mismo objetivo: obtener una lista de archivos y directorios. Deben recordarse los siguientes puntos clave:

  • La función glob() es una solución integrada, pero no es lo suficientemente flexible.
  • Una solución basada en opendir() , readdir() y closedir() es más compleja y requiere filtrado adicional, pero es más flexible.
  • La función scandir() requiere filtrado adicional, pero funciona sin procesar el identificador.
  • Si está utilizando un enfoque de programación orientada a objetos, entonces debería utilizar la biblioteca SPL. Además, puedes ampliar las clases con tu propia funcionalidad.
  • GlobIterator tiene una función de prefiltrado, mientras que otros usan RegexIterator.

Reg.ru: dominios y hosting

El mayor registrador y proveedor de alojamiento de Rusia.

Más de 2 millones de nombres de dominio en servicio.

Promoción, correo de dominio, soluciones empresariales.

Más de 700.000 clientes en todo el mundo ya han elegido.

*Pase el mouse sobre para pausar el desplazamiento.

Atrás Adelante

Obtener una lista de carpetas usando PHP

Listado de directorios usando PHP o listado de directorios

Llamaremos listado de directorios a una consulta general que genera una lista de todos o algunos archivos y directorios del directorio principal, un proceso similar al trabajo de la página de índice proporcionada por la mayoría de los servidores web, pero con oh mayor control sobre el contenido y formato de los mismos.

Otra ventaja de este script es la posibilidad de realizar determinadas acciones con archivos utilizando PHP. En cualquier caso, el primer paso que debemos hacer es consultar el sistema de archivos y devolver una lista de archivos y directorios.

Las funciones que se presentan a continuación le permiten extraer nombres de archivos y otras propiedades de un directorio específico, o recorrer subcategorías de forma recursiva.

Comentario: PHP5 tiene una función escanear, que "devuelve una lista de archivos y directorios dentro de un directorio en una ruta determinada", pero no muestra ninguna información adicional sobre los archivos dentro del directorio.

Listado de un directorio

Para empezar, aquí hay un ejemplo de una función simple que devuelve una lista de archivos, directorios y sus propiedades de un directorio (encontrará versiones más avanzadas de esta función un poco más adelante en esta lección).

read())) ( // omitir archivos ocultos if($entry == ".") continuar; if(is_dir("$dir$entry")) ( $retval = array("nombre" => "$dir$ entrada/", "tamaño" => 0, "lastmod" => filemtime("$dir$entrada")); ) elseif(is_readable("$dir$entrada")) ( $retval = array("nombre" = > "$dir$entrada", "tamaño" => tamaño del archivo("$dir$entrada"), "lastmod" => filemtime("$dir$entrada") ) ) $d->close();

devolver $retval;

) ?>

Puede utilizar esta función como se muestra a continuación:

El valor de retorno es una matriz asociativa de archivos, incluida la información de la ruta del archivo, el tamaño y la fecha de la última modificación, a menos que el archivo sea un directorio, en cuyo caso aparece la cadena "(dir)" en lugar del tamaño del archivo. Ejemplo 1:

",print_r($listadir)"

El valor de retorno es una matriz asociativa de archivos, incluida la información de la ruta del archivo, el tamaño y la fecha de la última modificación, a menos que el archivo sea un directorio, en cuyo caso aparece la cadena "(dir)" en lugar del tamaño del archivo."; /* ejemplo de salida de Matriz ( => Matriz ( => imágenes/fondo0.jpg => imagen/jpeg => 86920 => 1077461701) => ...) */ ?>

Ejemplo 2:

"; /* ejemplo de salida de Matriz ( => Matriz ( => ./images/background0.jpg => imagen/jpeg => 86920 => 1077461701) => ...) */ ?>

Listado de archivos a través de HTML Para obtener los resultados de salida en la página en HTML, recorreremos la matriz devuelta\n"; eco "NombreTipo Tamaño Listado de archivos a través de HTML Última modificación. Listado de archivos a través de HTML \n"; foreach($listadir como $archivo) ( echo " Listado de archivos a través de HTML ($archivo["nombre"]) Listado de archivos a través de HTML Listado de archivos a través de HTML($archivo["tipo"])($archivo["tamaño"])

\n"; ) eco "

  • \n\n"; ?>
  • Este código es bastante fácil de modificar, por ejemplo:
  • - mostrar los resultados del listado como una lista en lugar de una tabla;
  • - hacer que los nombres de los archivos sean enlaces activos;

- reemplazar nombres con íconos según el tipo de archivo que sea;

Listado de archivos a través de HTML Para obtener los resultados de salida en la página en HTML, recorreremos la matriz devuelta\n"; eco "NombreTipo etc. Listado de archivos a través de HTML Última modificación. Listado de archivos a través de HTML \n"; foreach($listadir como $archivo) ( echo " Listado de archivos a través de HTML ($archivo["nombre"]) Listado de archivos a través de HTML Por ejemplo, para generar solo archivos PNG, agregue una condición simple al bucle de salida: Listado de archivos a través de HTML($archivo["tipo"])($archivo["tamaño"])

\n"; foreach($dirlist as $file) ( //comprueba si el archivo es PNG if(!preg_match("/\.png$/", $file["name"])) continue; echo " ",fecha("r", $archivo["últimomod"]),". También puede aplicar condiciones adicionales según el tipo de archivo, el tamaño o la fecha en que se modificó por última vez.

Si, por ejemplo, desea mostrar una miniatura, un enlace a una imagen más grande o incluso un video, simplemente asigne a estos 2 archivos los mismos nombres y en el script anterior use str_replace o función similar para modificar el contenido de los enlaces.

Listado de directorio recursivo

Y como hemos llegado hasta aquí, solo habrá cambios menores en la lista recursiva y la función de llamada de subcategoría. Al agregar un segundo parámetro a la función, conservamos la funcionalidad anterior de enumerar un solo directorio.

read())) ( // omitir archivos ocultos if($entry == ".") continuar; if(is_dir("$dir$entry")) ( $retval = array("nombre" => "$dir$ entrada/", "tamaño" => 0, "lastmod" => filemtime("$dir$entrada")); if($recurse && is_readable("$dir$entrada/")) ( $retval = array_merge($ retval, getFileList("$dir$entrada/", verdadero) ) elseif(is_readable("$dir$entrada")) ( $retval = array("nombre" => "$dir$entrada", "tamaño " => tamaño de archivo("$dir$entrada"), "lastmod" => filemtime("$dir$entrada"));

devolver $retval; ) ?> Para que la nueva funcionalidad funcione, debe ingresar un valor

verdadero

(o 1) como segundo parámetro.

Antes de repetir el script, verifique si los subdirectorios son legibles y lea también el último párrafo de esta lección para evitar errores de acceso.

Como antes, el valor de retorno es una matriz, una matriz asociativa. De hecho, la única adición es otra opción adicional para el listado recursivo.

read())) ( // omitir archivos ocultos if($entry == ".") continuar; if(is_dir("$dir$entry")) ( $retval = array("nombre" => "$dir$ entrada/", "tamaño" => 0, "lastmod" => filemtime("$dir$entrada")); if($recurse && is_readable("$dir$entrada/")) ( if($profundidad == = false) ( $retval = array_merge($retval, getFileList("$dir$entrada/", verdadero)); ) elseif($profundidad > 0) ( $retval = array_merge($retval, getFileList("$dir$entrada /", verdadero, $profundidad-1)); ) ) ) elseif(is_readable("$dir$entrada")) ( $retval = array("nombre" => "$dir$entrada", "tamaño" => tamaño de archivo("$dir$entrada"), "lastmod" => filemtime("$dir$entrada") ) ) $d->close();

devolver $retval; ) ?> Como antes, agregamos solo 1 FALSO nuevo parámetro

y un par de líneas de código. Si no se especifica el valor predeterminado responsable de la profundidad de recursión, entonces se establece en

. Esto nos permite estar seguros de que las características anteriores permanecen y que el código posterior no se “romperá” cuando cambie la función.

Trabajar con archivos

El programador se enfrenta muy a menudo a la necesidad de realizar operaciones con archivos. Si sus scripts no utilizan bases de datos, los archivos son los únicos dispositivos de almacenamiento aceptables para el script. El uso de archivos como depósitos de información de ejecución de scripts permite su uso en una amplia variedad de situaciones. Casi todos los contraguiones de algo se escriben basándose en el trabajo con archivos. También es posible dar muchos otros ejemplos, pero es hora de pasar directamente de las palabras a la acción.

Quiero decir de inmediato que se debe autorizar el trabajo con el archivo. De forma predeterminada, PHP no permite la manipulación de archivos por razones de seguridad. Para eliminar esta prohibición en el administrador FTP de CuteFTP, marque todas las casillas en las propiedades del archivo, otros administradores deberían tener algo similar. archivo_existe Antes de realizar operaciones en un archivo, a menudo es necesario asegurarse de que el archivo especificado exista. Esto es lo que hace la función file_exists. Esta función solo puede devolver dos valores, como puedes imaginar. VERDADERO(si el archivo especificado existe) y

FALSO

. Normalmente, el uso de esta función tiene este aspecto:

Tenga en cuenta que la función solo funciona en archivos locales, es decir, si desea verificar si Yandex ha adquirido un archivo robot.txt, sus esfuerzos serán en vano. Pero es posible comprobar cualquier archivo ubicado en el servidor local, independientemente del directorio de su ubicación.

Como sugiere el nombre, la función determina el tamaño del archivo y lo devuelve en bytes. Útil si desea verificar un archivo para ver si contiene información (como puede imaginar, un archivo vacío contiene 0 bytes), y también es posible verificar el tamaño del archivo para ver si excede un cierto límite.

archivo

Esta función ya funciona directamente con el archivo. Devuelve el contenido del archivo especificado y lo hace en forma de matriz, donde cada elemento es una línea del archivo. La función es útil cuando necesita almacenar varios valores diferentes en un archivo que no deben cruzarse. Luego, cada valor se almacena en una línea separada y la función de archivo lo lee, que devuelve una matriz, mediante la cual se accede a la variable dada leyendo el valor del elemento de la matriz con el índice correspondiente a la línea del archivo.

También es posible reunir todos los elementos de la matriz devuelta en una sola variable. Esto se hace usando la función de matriz de implosión.

abrir

Si la función anterior es independiente y generalmente no está relacionada con otras funciones, las funciones posteriores para trabajar con archivos funcionan junto con fopen. Esta función abre el archivo especificado y devuelve el identificador de conexión del archivo, que se utiliza con fines de servicio. Esta función no está asociada de ninguna manera con el contenido del archivo.

La función fopen tiene varios modos para trabajar con un archivo. Se indican después del nombre del archivo y son los siguientes:

    "r"
    El archivo se abre para leer únicamente su contenido.

    "r+"
    Abrir un archivo para lectura y escritura.

    "w"
    El archivo se abre con fines de escritura.

    "w+"
    Abra el archivo para leer y escribir.

    "a"
    El archivo se abre para escribir hasta el final del archivo (adjuntar).

    "un+"
    Se abre para más escritura y lectura.

fgets

Función para leer un archivo abierto por la función fopen. Pero a diferencia del archivo, esta función devuelve solo una línea del archivo cada vez que se ejecuta y mueve el puntero del archivo interno a la siguiente línea, que leerá la próxima vez que se llame a la función. Por lo tanto, si necesita leer el archivo completo, debe utilizar esta función en bucle.

Tenga en cuenta que la función fgets utiliza un parámetro de longitud adicional, que especifica la longitud máxima de una línea de archivo para leer. Si el tamaño de la cadena excede este número, la función la devolverá en forma "truncada" con una longitud de bytes. De forma predeterminada, este parámetro está establecido en 1024 bytes o un kilobyte. Preste especial atención a este parámetro si utiliza archivos grandes, ya que al leer dichos archivos, el búfer de ejecución de PHP puede desbordarse (su tamaño se indica en el archivo de configuración), lo que provocará una congelación.

Tenga en cuenta que el archivo a leer no es el nombre del archivo, sino el identificador de conexión del archivo devuelto por la función fopen (en nuestro ejemplo, el valor de la variable $file).

entradas

La función de escribir información en un archivo, y lo hace de acuerdo con el principio de la función fgets, es decir, comienza a escribir desde la posición del puntero interno del archivo. En general, esta función es en muchos aspectos similar a la anterior: también utiliza el parámetro de longitud de datos de escritura, que también es opcional.

cerrar

Como habrás adivinado, esta función cierra el archivo especificado. En realidad, al finalizar el script, PHP cierra todos los archivos abiertos, pero es mejor hacerlo manualmente. Como parámetro de función, debe especificar el identificador de conexión del archivo.

Para ilustrar la combinación de las funciones anteriores, daremos un ejemplo de cómo crear un contador de visitas simple.

$archivo = fopen("contador.txt", "r");
$c = fgets($archivo, 150);
fclose($archivo);
$c++;
$archivo = fopen("contador.txt", "w");
fputs($archivo, $c);
fclose($archivo);
eco $c;
?>

Trabajar con directorios

Estrechamente relacionadas con las acciones sobre archivos están las operaciones sobre directorios. El algoritmo para trabajar con ellos es similar a las operaciones con archivos: primero debe abrir el directorio, realizar algunas acciones y, finalmente, cerrarlo.

abrirdir

Esta función abre el directorio especificado y devuelve el identificador de servicio para la conexión del directorio. Las rutas de directorio deben especificarse de la siguiente manera:

El punto significa abrir el directorio actual.

. /archivos/

Abrir una carpeta archivos ubicado en el directorio actual

Abrir una carpeta de un nivel superior al actual

leerdir

La función lee el directorio abierto por opendir. Para cada pasada, devuelve el nombre del archivo o carpeta ubicado en el directorio especificado y mueve el puntero interno al siguiente objeto de directorio. Entonces, para leer el directorio completo, debe usarse en un bucle.

También cabe señalar que esta función devuelve objetos de servicio de carpeta . Y .. , que se puede recortar cuando se genera mediante la declaración IF.

cerrado

Cerramos el directorio, especificando el identificador de conexión de la carpeta como argumento.

A veces, utilizar funciones de directorio hace la vida mucho más fácil. Por ejemplo, en la sección Funciones, puede ver una lista de funciones en orden alfabético. ¿Te imaginas cuánto tiempo llevaría escribir manualmente esta lista completa con enlaces, e incluso en orden alfabético? Y aquí me ayudaron las funciones para trabajar con directorios. Cada función se colocó en un archivo separado con un nombre correspondiente al nombre de la función, sin extensiones.

Entonces, cada vez que visita la página, obtiene una lista de funciones recién generada.

Eso es todo. Nos vemos en la próxima lección.

El listado de directorios es el proceso de obtener información sobre directorios y archivos para un directorio principal determinado, así como la capacidad de aplicar varios filtros a estos datos para corregir la salida.

En este ejemplo, intentaremos hacer frente a una tarea típica que aparece en casi todos los PHP proyecto - obtención de una lista de directorios y/o archivos. El ejemplo utiliza varios enfoques básicos y más complejos, y describe los pros y los contras de cada técnica. Las primeras tres soluciones utilizan funciones PHP estándar. La última solución más confiable que utiliza iteradores PHP SPL.


Para una representación más visual, utilizamos una estructura de directorios similar a esta:


\-Aplicación | \-Usuario | \-datos.apk | \-estilo.css | \-test.txt |-readme.txt |-script.php |-serial.txt |-test.html |-test.js

Soluciones básicas
El primer conjunto de ejemplos utiliza funciones. globo() y combinaciones de funciones abrirdir(), leerdir(), cerrardir(), así como la función escanear().

Usando globo()

Ejemplo de uso funciones php globo(), que le permite buscar una ruta usando un patrón.
Función globo( $patrón,$banderas) opera con dos argumentos:
  • $patrón(obligatorio): cadena de patrón de búsqueda
  • $banderas
    • GLOB_MARK- Agrega una barra diagonal a cada directorio devuelto.
    • GLOB_NOSORT- Devuelve archivos en la forma en que están contenidos en el directorio (sin ordenar). Si no se especifica esta bandera, los nombres se ordenan alfabéticamente.
    • GLOB_NOCHECK- Devuelve un patrón de búsqueda si no se encontraron archivos usándolo.
    • GLOB_NOESCAPE- Las barras invertidas no escapan a los metacaracteres.
    • GLOB_BRACE- Expande (a,b,c) para que coincida con "a", "b" o "c".
    • GLOB_ONLYDIR- Devuelve sólo directorios que coinciden con el patrón.
    • GLOB_ERR- Se detiene ante errores de lectura (por ejemplo, directorios sin permiso de lectura); de forma predeterminada, los errores se ignoran.
Para buscar en un directorio todos los archivos y directorios cuyos nombres terminan en .txt, utilice el siguiente código:En la salida obtenemos el siguiente resultado: array(2) ( => string(10) "readme.txt" => string(10) "serial.txt" ) Si necesita obtener una lista de archivos y directorios cuyos nombres comience con "te":En la salida obtenemos el siguiente resultado: array(2) ( => string(9) "test.html" => string(7) "test.js" ) Obteniendo solo directorios con nombres que contienen "er" en la lista:En la salida obtenemos el siguiente resultado: array(1) ( => string(4) "Usuario" )

El último ejemplo usa la bandera. GLOB_ONLYDIR como segundo argumento de la función. Por lo tanto, solo se incluyó en la lista el directorio "Usuario" en el nombre, que contiene "er". La función glob() es muy fácil de usar, pero a veces no es lo suficientemente flexible. No hay ningún indicador para obtener sólo archivos (sin directorios) que coincidan con el patrón.

Usando opendir(), readdir() y closedir().

El siguiente método para obtener una lista de archivos y directorios es utilizar funciones PHP abrirdir(), leerdir() Y cerrardir().

Función abrirdir() devuelve un identificador al directorio abierto. Una vez recibido el identificador, puede utilizar la función leerdir(). Al acceder a un identificador, la función leerdir() muestra el nombre del siguiente archivo o directorio. Si todos los elementos contenidos en el descriptor ya han sido enumerados, la función leerdir() regresará FALSO. Para cerrar el descriptor usamos la función cerrardir().


A diferencia del uso de la función php , este enfoque es un poco más complicado. No es posible establecer parámetros de filtrado que ayuden a generar una lista de nombres de archivos y directorios devueltos por adelantado. Para obtener la lista requerida de archivos y directorios, el filtrado debe realizarse de forma independiente.


El siguiente ejemplo devuelve una lista de nombres de archivos y directorios que comienzan con "Nosotros":El resultado será: array(1) ( => string(4) "User" ) El siguiente ejemplo generará solo los archivos contenidos en el directorio dado.En la salida obtenemos el siguiente resultado: array(5) ( => string(10) "script.php" => string(7) "test.js" => string(9) "test.html" => string (10) "serial.txt" => cadena(10) "readme.txt" )

Usando scandir().

Para terminar, veamos un ejemplo del uso de una función php. escanear(). Sólo tiene un atributo obligatorio: la ruta al directorio de lectura. El resultado de la función es una matriz de archivos y directorios ubicados a lo largo de la ruta especificada en el argumento. Como en el ejemplo anterior, para obtener una lista filtrada de archivos y directorios, debes ejecutarla tú mismo. Visualmente, la solución es más corta y no requiere gestión de descriptores.


El ejemplo muestra cómo obtener una lista de archivos y directorios cuyos nombres comienzan con "te":En la salida obtenemos el siguiente resultado: array(2) ( => string(9) "test.html" => string(7) "test.js" )

Solución avanzada usando PHP SPL
Solución más confiable utilizando iteradores SPL Sistema de archivosIterador, RecursivoDirectorioIterador Y GlobalIterador.

Usando iteradores SPL.

Veamos el uso de iteradores SPL. Antes de comenzar a resolver el problema, familiaricémonos un poco con la biblioteca PHP SPL y los iteradores. La biblioteca SPL proporciona conjuntos especializados de clases para estructuras de datos orientadas a objetos, iteradores, descriptores de archivos y más.


La principal ventaja de los iteradores es que son clases y se pueden ampliar mediante un mecanismo estándar. herencia php clases. Otra ventaja es que los iteradores tienen sus propios métodos que pueden resultar útiles para resolver problemas comunes y todos están ubicados en un solo lugar. Veamos un ejemplo de uso. Sistema de archivosIterador y comparar con leerdir(). Ambos métodos utilizan un bucle, pero en caso leerdir() será posible procesar sólo la cadena, pero Sistema de archivosIterador Puede trabajar con un objeto. Que puede contener información adicional sobre el archivo o directorio, como propietario, tamaño, derechos de acceso, etc.


Por supuesto, PHP tiene la capacidad de obtener esta información usando funciones, tamaño de archivo(), propietario del archivo() y otros. Pero PHP, como cualquier lenguaje de programación, tiene la capacidad de cambiar. En PHP5 existe un deseo cada vez mayor de utilizar conceptos de programación orientada a objetos. Por lo tanto, es mejor utilizar métodos modernos para trabajar con un lenguaje de programación.


Considere usar Sistema de archivosIterador, RecursivoDirectorioIterador Y GlobalIterador. El primer iterador se hereda de DirectorioIterador, y el resto de Sistema de archivosIterador. Todos tienen el mismo constructor, que toma dos argumentos:

  • $ruta(obligatorio): ruta al elemento del sistema de archivos en el que se realizan las operaciones
  • $banderas(opcional): una o más banderas
    • FilesystemIterator::CURRENT_AS_PATHNAME Hace que el método FilesystemIterator::current() devuelva una ruta.
    • Sistema de archivosIterator::CURRENT_AS_FILEINFO Hace que el método FilesystemIterator::current() devuelva una instancia de SplFileInfo.
    • Sistema de archivosIterator::CURRENT_AS_SELF Hace que el método FilesystemIterator::current() devuelva $this (FilesystemIterator).
    • FilesystemIterator::CURRENT_MODE_MASK Máscaras FilesystemIterator::current()
    • FilesystemIterator::KEY_AS_PATHNAME Hace que el método FilesystemIterator::key() devuelva una ruta.
    • FilesystemIterator::KEY_AS_FILENAME Hace que el método FilesystemIterator::key() devuelva el nombre del archivo.
    • Sistema de archivosIterator::FOLLOW_SYMLINKS Fuerza al método RecursiveDirectoryIterator::hasChildren() a seguir enlaces simbólicos.
    • Sistema de archivosIterator::KEY_MODE_MASK Máscaras FilesystemIterator::key()
    • FilesystemIterator::NEW_CURRENT_AND_KEY Igual que FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO.
    • Sistema de archivosIterador::SKIP_DOTS Salta archivos de puntos (. y ..).
    • FilesystemIterator::UNIX_PATHS Obliga a todas las rutas a utilizar barras invertidas al estilo Unix, independientemente de la configuración predeterminada del sistema.

La diferencia entre estos iteradores es cómo se utilizan para navegar por una ruta determinada.

Sistema de archivosIterador

Usar Sistema de archivosIterador muy simple.
El ejemplo muestra una búsqueda de todos los archivos y directorios cuyos nombres comienzan con "te".

getFilename(),"te")===0): $arFileList = $obFile->getFilename();

endif; final para cada uno; // Genera el resultado var_dump($arFileList); ?> En la salida obtenemos el siguiente resultado: array(2) ( => string(7) "test.js" => string(9) "test.html" ) Ejemplo de uso de otro iterador RegexIterador Ejemplo de uso de otro iterador para buscar todos los archivos y directorios cuyos nombres terminen con "t.js" o "t.php". Iterador

se utiliza para filtrar el resultado y utiliza un motor de expresiones regulares.

RecursivoDirectorioIterador

getFilename(); final para cada uno; // Genera el resultado var_dump($arFileList); ?> En la salida obtenemos el siguiente resultado: array(2) ( => string(10) "script.php" => string(7) "test.js" ) RecursivoDirectorioIterador Iterador proporciona una interfaz para recorrer recursivamente los directorios del sistema de archivos. Tiene varios métodos útiles como Y obtener niños() tiene hijos()


RecursivoDirectorioIterador Y proporciona una interfaz para recorrer recursivamente los directorios del sistema de archivos. Tiene varios métodos útiles como. , que devuelve un iterador para la ubicación actual si es un directorio y verifica si el punto de entrada actual es un directorio. getChildren(), "/t\.(txt|css)$/"); $arFileList = matriz(); foreach($rxIterator como $obFile): $arFileList = $obFile->getFilename(); final para cada uno; //Mostrar el resultado var_dump($arFileList); ?> En la salida obtenemos el siguiente resultado: en este caso

GlobalIterador

getFilename(); final para cada uno; // Genera el resultado var_dump($arFileList); ?> En la salida obtenemos el siguiente resultado: array(2) ( => string(10) "script.php" => string(7) "test.js" ) GlobalIterador realiza un recorrido de archivos similar al . El primer atributo puede incluir un patrón de nombre.


El ejemplo demuestra el uso GlobalIterador con el mismo resultado que antes.getFilename(); final para cada uno; //Mostrar el resultado var_dump($arFileList); ?> En la salida obtenemos el siguiente resultado: array(2) ( => string(10) "/test.html" => string(8) "/test.js" )

Conclusión

Los ejemplos anteriores fueron considerados varios metodos PHP para lograr el mismo objetivo: obtener una lista de archivos y directorios.

De los ejemplos se pueden destacar los siguientes puntos principales: