diff --git a/src/includes/closures/Shared/FsUtils.php b/src/includes/closures/Shared/FsUtils.php index 6ad42c5f..c3ef2767 100644 --- a/src/includes/closures/Shared/FsUtils.php +++ b/src/includes/closures/Shared/FsUtils.php @@ -126,42 +126,43 @@ }; /* - * Recursive directory iterator based on a regex pattern. + * Recursive directory iterator. * - * @since 150422 Rewrite. + * @since 15xxxx Adding a few statistics. * * @param string $dir An absolute server directory path. - * @param string $regex A regex pattern; compares to each full file path. * * @return \RegexIterator Navigable with {@link \foreach()}; where each item * is a {@link \RecursiveDirectoryIterator}. */ -$self->dirRegexIteration = function ($dir, $regex) use ($self) { - $dir = (string) $dir; - $regex = (string) $regex; - - $dir_iterator = new \RecursiveDirectoryIterator($dir, \FilesystemIterator::KEY_AS_PATHNAME | \FilesystemIterator::CURRENT_AS_SELF | \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS); - $iterator_iterator = new \RecursiveIteratorIterator($dir_iterator, \RecursiveIteratorIterator::CHILD_FIRST); - $regex_iterator = new \RegexIterator($iterator_iterator, $regex, \RegexIterator::MATCH, \RegexIterator::USE_KEY); +$self->dirIteration = function ($dir) use ($self) { + $dir = (string) $dir; - return $regex_iterator; + $dir_iterator = new \RecursiveDirectoryIterator($dir, \FilesystemIterator::KEY_AS_PATHNAME | \FilesystemIterator::CURRENT_AS_SELF | \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS); + return new \RecursiveIteratorIterator($dir_iterator, \RecursiveIteratorIterator::CHILD_FIRST); }; /* - * Recursive directory iterator. + * Recursive directory iterator based on a regex pattern. * - * @since 15xxxx Adding a few statistics. + * @since 150422 Rewrite. * * @param string $dir An absolute server directory path. + * @param string $regex A regex pattern; compares to each full file path. * * @return \RegexIterator Navigable with {@link \foreach()}; where each item * is a {@link \RecursiveDirectoryIterator}. */ -$self->dirIteration = function ($dir) use ($self) { - $dir = (string) $dir; +$self->dirRegexIteration = function ($dir, $regex = '/.+/') use ($self) { + $dir = (string) $dir; + $regex = (string) $regex; + $regex = !$regex ? '/.+/' : $regex; - $dir_iterator = new \RecursiveDirectoryIterator($dir, \FilesystemIterator::KEY_AS_PATHNAME | \FilesystemIterator::CURRENT_AS_SELF | \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS); - return new \RecursiveIteratorIterator($dir_iterator, \RecursiveIteratorIterator::CHILD_FIRST); + $dir_iterator = new \RecursiveDirectoryIterator($dir, \FilesystemIterator::KEY_AS_PATHNAME | \FilesystemIterator::CURRENT_AS_SELF | \FilesystemIterator::SKIP_DOTS | \FilesystemIterator::UNIX_PATHS); + $iterator_iterator = new \RecursiveIteratorIterator($dir_iterator, \RecursiveIteratorIterator::CHILD_FIRST); + $regex_iterator = new \RegexIterator($iterator_iterator, $regex, \RegexIterator::MATCH, \RegexIterator::USE_KEY); + + return $regex_iterator; }; /* @@ -170,12 +171,13 @@ * @since 15xxxx Adding a few statistics. * * @param string $dir An absolute server directory path. + * @param string $regex A regex pattern; compares to each full file path. * @param boolean $reconsider Bypass cached statistics? * * @return \stdClass `total_size`, `total_links`, `total_files`, `total_dirs`. */ -$self->getDirStats = function ($dir, $reconsider = false) use ($self) { - if (!is_null($stats = &$self->staticKey('getDirStats', $dir)) && !$reconsider) { +$self->getDirRegexStats = function ($dir, $regex = '/.+/', $reconsider = false) use ($self) { + if (!is_null($stats = &$self->staticKey('getDirStats', array($dir, $regex))) && !$reconsider) { return $stats; // Already cached this. } $stats = (object) array( @@ -189,7 +191,7 @@ if (!is_dir($dir = (string) $dir)) { return $stats; // Not possible. } - foreach ($self->dirIteration($dir) as $_resource) { + foreach ($self->dirRegexIteration($dir, $regex) as $_resource) { switch ($_resource->getType()) { // `link`, `file`, `dir`. case 'link': // Symbolic links.