file_scan_directory($dir, $mask,$options= array(), $depth = 0)
Finds all files that match a given mask in a given directory.
Directories and files beginning with a dot are excluded; this prevents hidden files and directories (such as SVN working directories) from being scanned. Use the umask option to skip configuration directories to eliminate the possibility of accidentally exposing configuration information. Also, you can use the base directory, recurse, and min_depth options to improve performance by limiting how much of the filesystem has to be traversed.
$dir: The base directory or URI to scan, without trailing slash.
$mask: The preg_match() regular expression for files to be included.
$options: An associative array of additional options, with the following elements:
$depth: The current depth of recursion. This parameter is only used internally and should not be passed in.
An associative array (keyed on the chosen key) of objects with 'uri', 'filename', and 'name' properties corresponding to the matched files.
function file_scan_directory($dir, $mask, $options = array(), $depth = 0) { // Merge in defaults. $options += array( 'callback' => 0, 'recurse' => TRUE, 'key' => 'uri', 'min_depth' => 0, ); // Normalize $dir only once. if ($depth == 0) { $dir = file_stream_wrapper_uri_normalize($dir); $dir_has_slash = (substr($dir, -1) === '/'); } $options['key'] = in_array($options['key'], array('uri', 'filename', 'name')) ? $options['key'] : 'uri'; $files = array(); // Avoid warnings when opendir does not have the permissions to open a // directory. if (is_dir($dir)) { if ($handle = @opendir($dir)) { while (FALSE !== ($filename = readdir($handle))) { // Skip this file if it matches the nomask or starts with a dot. if ($filename[0] != '.' && !(isset($options['nomask']) && preg_match($options['nomask'], $filename))) { if ($depth == 0 && $dir_has_slash) { $uri = "$dir$filename"; } else { $uri = "$dir/$filename"; } if ($options['recurse'] && is_dir($uri)) { // Give priority to files in this folder by merging them in after // any subdirectory files. $files = array_merge(file_scan_directory($uri, $mask, $options, $depth + 1), $files); } elseif ($depth >= $options['min_depth'] && preg_match($mask, $filename)) { // Always use this match over anything already set in $files with // the same $options['key']. $file = new stdClass(); $file->uri = $uri; $file->filename = $filename; $file->name = pathinfo($filename, PATHINFO_FILENAME); $key = $options['key']; $files[$file->$key] = $file; if ($options['callback']) { $options['callback']($uri); } } } } closedir($handle); } else { \Drupal::logger('file')->error('@dir can not be opened', array('@dir' => $dir)); } } return $files; }
© 2001–2016 by the original authors
Licensed under the GNU General Public License, version 2 and later.
Drupal is a registered trademark of Dries Buytaert.
https://api.drupal.org/api/drupal/core!includes!file.inc/function/file_scan_directory/8.1.x