protected function getDirFileInfo(string $source_dir, bool $top_level_only = true, bool $_recursion = false)
	{
		static $_filedata = [];
		$relative_path    = $source_dir;

		if ($fp = @opendir($source_dir))
		{
			// reset the array and make sure $source_dir has a trailing slash on the initial call
			if ($_recursion === false)
			{
				$_filedata  = [];
				$source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
			}

			// Used to be foreach (scandir($source_dir, 1) as $file), but scandir() is simply not as fast
			while (false !== ($file = readdir($fp)))
			{
				if (is_dir($source_dir . $file) && $file[0] !== '.' && $top_level_only === false)
				{
					$this->getDirFileInfo($source_dir . $file . DIRECTORY_SEPARATOR, $top_level_only, true);
				}
				elseif ($file[0] !== '.')
				{
					$_filedata[$file]                  = $this->getFileInfo($source_dir . $file);
					$_filedata[$file]['relative_path'] = $relative_path;
				}
			}

			closedir($fp);

			return $_filedata;
		}

		return false;
	}
protected function getDirFileInfo(string $source_dir, bool $top_level_only = true, bool $_recursion = false)
	{
		static $_filedata = [];
		$relative_path    = $source_dir;

		if ($fp = @opendir($source_dir))
		{
			// reset the array and make sure $source_dir has a trailing slash on the initial call
			if ($_recursion === false)
			{
				$_filedata  = [];
				$source_dir = rtrim(realpath($source_dir), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR;
			}

			// Used to be foreach (scandir($source_dir, 1) as $file), but scandir() is simply not as fast
			while (false !== ($file = readdir($fp)))
			{
				if (is_dir($source_dir . $file) && $file[0] !== '.' && $top_level_only === false)
				{
					$this->getDirFileInfo($source_dir . $file . DIRECTORY_SEPARATOR, $top_level_only, true);
				}
				elseif ($file[0] !== '.')
				{
					$_filedata[$file]                  = $this->getFileInfo($source_dir . $file);
					$_filedata[$file]['relative_path'] = $relative_path;
				}
			}

			closedir($fp);

			return $_filedata;
		}

		return false;
	}
protected function getDirFileInfo ( string $ source_dir , bool $ top_level_only = true , bool $ _recursion = false ) { static $ _filedata = [ ] ; $ relative_path = $ source_dir ; if ( $ fp = @ opendir ( $ source_dir ) ) { // reset the array and make sure $source_dir has a trailing slash on the initial call if ( $ _recursion === false ) { $ _filedata = [ ] ; $ source_dir = rtrim ( realpath ( $ source_dir ) , DIRECTORY_SEPARATOR ) . DIRECTORY_SEPARATOR ; } // Used to be foreach (scandir($source_dir, 1) as $file), but scandir() is simply not as fast while ( false !== ( $ file = readdir ( $ fp ) ) ) { if ( is_dir ( $ source_dir . $ file ) && $ file [ 0 ] !== '.' && $ top_level_only === false ) { $ this -> getDirFileInfo ( $ source_dir . $ file . DIRECTORY_SEPARATOR , $ top_level_only , true ) ; } elseif ( $ file [ 0 ] !== '.' ) { $ _filedata [ $ file ] = $ this -> getFileInfo ( $ source_dir . $ file ) ; $ _filedata [ $ file ] [ 'relative_path' ] = $ relative_path ; } } closedir ( $ fp ) ; return $ _filedata ; } return false ; }
Get Directory File Information

Reads the specified directory and builds an array containing the filenames,
filesize, dates, and permissions

Any sub-folders contained within the specified path are read as well.

@param string  $source_dir     Path to source
@param boolean $top_level_only Look only at the top level directory specified?
@param boolean $_recursion     Internal variable to determine recursion status - do not use in calls

@return array|false
Get Directory File Information