En el artículo anterior hablé de los iteradores que aporta PHP para acceder al sistema de archivos y puse una función para eliminar directorios de manera recursiva.
Ahora pondré una función que devuelve todos los archivos y directorios de un directorio de manera recursiva. También se puede filtrar el resultado para devolver solamente los directorios o los archivos.
- /**
- * Devuelve todos los archivos y directorios existentes en el directorio especificado.
- * Se eliminan los directorios . y .. del resultado.
- * Si se especifica $mode no se incluyen archivos especiales como sockets o enlaces.
- *
- * @param string $dir Directorio donde iniciar la búsqueda.
- * @param bool $mode Filtrar el resultado por archivos o directorios.
- * T_DIR para devolver solamente los directorios,
- * T_FILE para devolver solamente los archivos y
- * FALSE para devolver todo.
- *
- * @return array
- */
- public static function scandir($dir, $mode = FALSE)
- {
- /**
- * @var $_file \SplFileInfo
- */
- $_files = [];
- $_iterator = new \RecursiveIteratorIterator(
- new \RecursiveDirectoryIterator(
- $dir,
- \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS
- ),
- \RecursiveIteratorIterator::SELF_FIRST
- );
- foreach ($_iterator as $_file)
- {
- if (!$mode || ($mode === T_DIR && $_file->isDir()) || ($mode === T_FILE && $_file->isFile()))
- {
- $_files[] = $_file->getPathname();
- }
- }
- sort($_files);
- return $_files;
- }